当使用Python和pymongo从Mongo数据库获取具有子文档的对象的结果时,我遇到了这个奇怪的问题。
我有一份包含子文档列表的文档,例如
User: {
"_id": ....
hats: [{"colour": "blue" }]
}
我使用find_one()查询。它返回文档的详细信息和一个子文档记录。然而,接下来我做查询我得到两个“帽子”,第二个是第一个的副本。随着下一个我回来三个“帽子”,并继续这样。
如果我重新启动应用程序,则会重置上面的“count”,因此find_one()查询会再次返回一个子文档。
数据库中肯定只有一个子文档记录,所以这不是问题。它必须在内存中做一些奇怪的事情。
我使用的是Python“Tornado”框架,该应用程序是tornado.wsgi.WSGIApplication。每次有新请求时,都应该打开一个新连接。
请求处理程序按照
的顺序执行某些操作class Handler(RequestHandler):
def initialize(self):
self.db = MongoClient("localhost", 27017)
我真的很困惑它可能是什么。
答案 0 :(得分:0)
最终它与MongoDb无关。
对于数据库中的每个集合类型,我都有一个模型类。有了这个,我可以根据从服务器返回数据的方式来详细说明数据的存储方式。
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 = []
我认为它们是等价的,但是看起来直接在类上设置变量时,它们是在类的所有实例之间共享的静态变量。因此,当我将一个Hat添加到一个User对象的列表中时,下一个User对象已将该Hat添加到列表中并添加了另一个。