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

时间:2012-04-22 15:06:34

标签: python mongodb mongoengine

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

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


class Main(Document):
    Value = StringField
    Values = ListField(EmbeddedDocumentField(Sub))

当我在Main的'Values'字段中添加新的嵌入文档时,我生成一个唯一的id到列表而不是集合中。在Main的'values'中可以有多个Sub来自不同的User,我试图获取MongoEngine根据ID和用户以原子方式从List中删除“Sub”值。

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

Main.objects(id=main_id).update_one(pull__values__id=sub_id) 

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

1 个答案:

答案 0 :(得分:5)

只需使用EmbeddedDocument类传递sub_id

即可
Main.objects(id=main_id).update_one(pull__values__id = Sub(Id=sub_id).Id )