针对MongoDb和Python返回的同一子文档的多个记录的问题

时间:2015-04-25 16:10:56

标签: python mongodb tornado pymongo

当使用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)

我真的很困惑它可能是什么。

1 个答案:

答案 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添加到列表中并添加了另一个。