MongoDb和Python返回同一子文档的多条记录时出现问题

MongoDb和Python返回同一子文档的多条记录时出现问题,python,mongodb,tornado,pymongo,Python,Mongodb,Tornado,Pymongo,我在使用Python和pymongo从Mongo数据库中获取包含子文档的对象的结果时遇到了这个奇怪的问题 我有一个包含子文档列表的文档,例如 User: { "_id": .... hats: [{"colour": "blue" }] } 我使用find_one()查询这个。它返回文档和该子文档记录的详细信息。然而,接下来我进行查询,我得到两个“帽子”,第二个是第一个的副本。下一次,我得到了三顶“帽子”,并继续这样下去 如果我重新启动应用程序,上面的“count”将被重置,因

我在使用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)

我真的对它可能是什么感到困惑。

最终它与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 = []

我认为它们是等价的,但是当变量直接在类上设置时,它们似乎是在类的所有实例之间共享的静态变量。因此,当我为一个用户对象向列表中添加帽子时,下一个用户对象的帽子已经在列表中,并添加了另一个。

我们需要更多信息来帮助调试。你能展示一下“find_one”调用和几行代码吗?您提到了一个“count”,但在您的示例中没有“count”字段,因此您没有向我们显示相关代码。我指的是重复子文档的数量。不是数据库调用。find one all一点也不复杂,它只是.find_one({“\u id”:as_objectid(lobby\u id)})。作为_objectid,它只是一个带有“如果值为None-else objectid(str(value)),则返回None”的函数,谢谢John。到目前为止,您共享的任何内容都无法为我提供解决方案,因此,如果您可以实际粘贴执行find_one的代码,以及除此之外的任何循环代码?你写道,“下一步我做查询,我得到两顶帽子”,那么是什么触发了额外的查询呢?这在MongoDB或PyMongo中不是一个已知的bug,因此我希望看到足够多的代码,以便能够看到bug。是的,您的措辞没有帮助。需要查看您的代码。尤其是你的这一段>>>>>我使用find_one()查询这一点。它返回文档和该子文档记录的详细信息。然而,接下来我进行查询,我得到两个“帽子”,第二个是第一个的副本。下一次,我得到了三顶“帽子”,并继续这样下去。