为 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 的所有实例之间共享的静态变量。因此,当我将一顶帽子添加到一个用户对象的列表中时,下一个用户对象的帽子已经在列表中并添加了另一个。