使用MongoDB,如何根据匹配从列表中删除嵌入文档

Tan*_*rax 3 python mongodb mongoengine

我有一个使用MongoEngine的文档和嵌入式文档

class Sub(EmbeddedDocument):
    Id = StringField()
    User = StringField()
    Value = StringField()


class Main(Document):
    Value = StringField
    Values = ListField(EmbeddedDocumentField(Sub))
Run Code Online (Sandbox Code Playgroud)

当我将新的嵌入文档添加到Main的'Values'字段中时,我会在列表中生成一个唯一的id而不是集合.在Main的'values'中可以有多个Sub来自不同的User,我试图让MongoEngine原子地删除列表中的"Sub"值,基于ID和用户.

我试图为Main运行一个select,然后为Sub本身运行update_one

Main.objects(id=main_id).update_one(pull__values__id=sub_id) 
Run Code Online (Sandbox Code Playgroud)

但所有这些似乎返回的是数组内部的索引.我知道我可以简单地拉Main,并通过值找到元素并删除它,但我试图保持这种原子,并且在拉,迭代,更新过程中更少有机会添加到sub.

rom*_*nlv 5

只需使用EmbeddedDocument类即可传递 sub_id

Main.objects(id=main_id).update_one(pull__values__id = Sub(Id=sub_id).Id )
Run Code Online (Sandbox Code Playgroud)

  • 我必须将`.id`添加到sub的末尾以使其工作:`Main.objects(id = main_id).update_one(pull__values__id = Sub(Id = sub_id).id)` (2认同)