Mongodb Mongoengine如何决定两个嵌入文档是否相等?
我有以下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)) 因此,我保留了一
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决定两个嵌入文档是否相等的函数
添加到\u集
和添加到集
),您会发现mongoengine不检查列表中存在的文档,只需调用:
在代码中有documentMyEmbed(embedField=“F1”)
并尝试添加另一个documentMyEmbed(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)