为 MongoDb 和 Python 返回同一子文档的多个记录的问题
Issue with multiple records of the same subdocument returned for MongoDb and Python
当使用 Python 和 pymongo 从 Mongo 数据库中取回带有子文档的对象的结果时,我遇到了这个奇怪的问题。
我有一个包含子文档列表的文档,例如
User: {
"_id": ....
hats: [{"colour": "blue" }]
}
我使用 find_one() 进行查询。它returns 返回文件的详细信息和那个子文件的记录。但是,接下来我执行查询,我得到两个 "hats",第二个是第一个的副本。接下来我得到三个 "hats" 并继续这样。
如果我重新启动应用程序,上面的 "count" 被重置,所以 find_one() 再次查询 returns 一个子文档。
数据库中肯定只有一个子文档记录,所以这不是问题。它一定在内存方面做了一些奇怪的事情。
我使用的是Python"Tornado"框架,应用是tornado.wsgi.WSGIApplication。每次收到新请求时,它都应该打开一个新连接。
请求处理程序按照
的方式做一些事情
class Handler(RequestHandler):
def initialize(self):
self.db = MongoClient("localhost", 27017)
我真的很困惑它会是什么。
最终与MongoDb无关。
对于数据库中的每个集合类型,我都有一个模型 class。有了这个,我可以将数据如何存储的确切细节与其从服务器返回的方式分离。
class User(ModelBase):
name = None
hats = []
@staticmethod
def from_db(document):
model = User()
model.name = document.get("name")
hats = document.get("hats", list())
from document in hats:
hat = Hat.from_db(document)
model.hats.append(hat)
return model
问题是我直接在模型上定义属性,而不是在init函数中设置。
也就是
class User(ModelBase):
name = None
hats = []
而不是
class User(ModelBase):
def __init__(self):
self.name = None
self.hats = []
我认为它们是等价的,但是当直接在 class 上设置变量时,它们似乎是在 class 的所有实例之间共享的静态变量。因此,当我将一顶帽子添加到一个用户对象的列表中时,下一个用户对象的帽子已经在列表中并添加了另一个。
当使用 Python 和 pymongo 从 Mongo 数据库中取回带有子文档的对象的结果时,我遇到了这个奇怪的问题。
我有一个包含子文档列表的文档,例如
User: {
"_id": ....
hats: [{"colour": "blue" }]
}
我使用 find_one() 进行查询。它returns 返回文件的详细信息和那个子文件的记录。但是,接下来我执行查询,我得到两个 "hats",第二个是第一个的副本。接下来我得到三个 "hats" 并继续这样。
如果我重新启动应用程序,上面的 "count" 被重置,所以 find_one() 再次查询 returns 一个子文档。
数据库中肯定只有一个子文档记录,所以这不是问题。它一定在内存方面做了一些奇怪的事情。
我使用的是Python"Tornado"框架,应用是tornado.wsgi.WSGIApplication。每次收到新请求时,它都应该打开一个新连接。
请求处理程序按照
的方式做一些事情class Handler(RequestHandler):
def initialize(self):
self.db = MongoClient("localhost", 27017)
我真的很困惑它会是什么。
最终与MongoDb无关。
对于数据库中的每个集合类型,我都有一个模型 class。有了这个,我可以将数据如何存储的确切细节与其从服务器返回的方式分离。
class User(ModelBase):
name = None
hats = []
@staticmethod
def from_db(document):
model = User()
model.name = document.get("name")
hats = document.get("hats", list())
from document in hats:
hat = Hat.from_db(document)
model.hats.append(hat)
return model
问题是我直接在模型上定义属性,而不是在init函数中设置。
也就是
class User(ModelBase):
name = None
hats = []
而不是
class User(ModelBase):
def __init__(self):
self.name = None
self.hats = []
我认为它们是等价的,但是当直接在 class 上设置变量时,它们似乎是在 class 的所有实例之间共享的静态变量。因此,当我将一顶帽子添加到一个用户对象的列表中时,下一个用户对象的帽子已经在列表中并添加了另一个。