Mongodb Mongoengine如何决定两个嵌入文档是否相等?

Mongodb Mongoengine如何决定两个嵌入文档是否相等?,mongodb,mongoengine,Mongodb,Mongoengine,我有以下Mongoengine文档: class MyEmbed(EmbeddedDocument): embedField = StringField(primary_key=True) varField = StringField() class TestDoc(Document): myField = StringField() embed_list = ListField(EmbeddedDocumentField(MyEmbed)) 因此,我保留了一

我有以下Mongoengine文档:

class MyEmbed(EmbeddedDocument):
    embedField = StringField(primary_key=True)
    varField = StringField()

class TestDoc(Document):
    myField = StringField()
    embed_list = ListField(EmbeddedDocumentField(MyEmbed))
因此,我保留了一个嵌入文档的列表,如果它们还不存在,我希望向其中添加新文档。问题是,当我使用原子更新操作符add_to_set时,事情并没有按照我希望的方式发展。 这就是我想做的:

embed1 = models.MyEmbed(embedField="F1")
parent = models.TestDoc(myField="ParentField")
embed_list = []
embed_list.append(embed1)
parent.embed_list = embed_list
parent.save()

embed2 = models.MyEmbed(embedField="F1", varField="varField")
TestDoc.objects(id=parent.id).update_one(add_to_set__embed_list=embed2)
问题是这样做之后,我在DB中有一个包含2个元素的嵌入式文档列表。我想要的是决定一个字段(本例中为EmbeddedField)两个EmbeddedDocuments是否相等,而不是考虑所有属性。我的问题是:

  • Mongoengine决定两个嵌入文档是否相等的默认标准是什么
  • 如何重新定义使Mongoengine决定两个嵌入文档是否相等的函数
谢谢

参见和:

它比较嵌入文档和数据的dict。所以你可以重写这个方法

如果查看调用QuerySet update的文档更新(查找
添加到\u集
添加到集
),您会发现mongoengine不检查列表中存在的文档,只需调用:

在代码中有document
MyEmbed(embedField=“F1”)
并尝试添加另一个document
MyEmbed(embedField=“F1”,varField=“varField”)
所以逻辑正确:它添加了新文档。如果您尝试下一个代码:

embed1 = models.MyEmbed(embedField="F1")
parent = models.TestDoc(myField="ParentField")
embed_list = []
embed_list.append(embed1)
parent.embed_list = embed_list
parent.save()

embed2 = models.MyEmbed(embedField="F1", varField="varField")
TestDoc.objects(id=parent.id).update_one(add_to_set__embed_list=embed2)

embed3 = models.MyEmbed(embedField="F1")
TestDoc.objects(id=parent.id).update_one(add_to_set__embed_list=embed3)

embed4 = models.MyEmbed(embedField="F1", varField="varField")
TestDoc.objects(id=parent.id).update_one(add_to_set__embed_list=embed4)
您可以发现父级仅包含
embed1
embed2


所以,为了解决您的问题,您可以重写
\uuuuuueq\uuuuu
方法并签入列表中的文档,但您必须为更新文档列表找到另一个解决方案,因为它直接调用了mongo方法。

实际的检查是在MongoDB内部完成的,而不是mongoengine


发送到mongodb的对象应该是相同的,但这是它变得棘手的地方,因为BSON顺序很重要,而在python中,字典则不是。当转换为发送到mongodb时,mongoengine只传递一个字典。这是一个错误-因此我添加了并将修复0.8的错误,它使用eq进行本地比较,但不用于查询,如在MongoDB中所示。我明白了。感谢您的解释。那么我真的很期待0.8…:D
embed1 = models.MyEmbed(embedField="F1")
parent = models.TestDoc(myField="ParentField")
embed_list = []
embed_list.append(embed1)
parent.embed_list = embed_list
parent.save()

embed2 = models.MyEmbed(embedField="F1", varField="varField")
TestDoc.objects(id=parent.id).update_one(add_to_set__embed_list=embed2)

embed3 = models.MyEmbed(embedField="F1")
TestDoc.objects(id=parent.id).update_one(add_to_set__embed_list=embed3)

embed4 = models.MyEmbed(embedField="F1", varField="varField")
TestDoc.objects(id=parent.id).update_one(add_to_set__embed_list=embed4)