【问题标题】:Using MongoDB, how do you remove embedded document from a list based on a match使用 MongoDB,如何根据匹配从列表中删除嵌入文档
【发布时间】:2016-07-07 23:35:20
【问题描述】:

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

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


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

当我将新的嵌入文档添加到 Main 的“值”字段中时,我会为列表而不是集合生成一个唯一的 id,在 Main 的“值”中可以有多个 Sub,每个来自不同的用户,我正在尝试获取 MongoEngine根据 ID 和用户从列表中自动删除“子”值。

我尝试为 Main 运行 select,然后为 Sub 本身运行 update_one

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

但这一切似乎返回的是数组内部的索引。我知道我可以简单地拉出 Main,然后通过 Values 找到元素并将其删除,但我试图保持这个原子性,并且在拉取、迭代、更新过程中将某些东西添加到 sub 的可能性较小。

【问题讨论】:

    标签: python mongodb mongoengine


    【解决方案1】:

    只需使用 EmbeddedDocument 类来传递sub_id

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

    【讨论】:

    • 我必须在 sub 末尾添加 .id 才能使其正常工作:Main.objects(id=main_id).update_one(pull__values__id = Sub(Id=sub_id).id )
    • @joeh 我也一样 - 我根据您的评论编辑了答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多