Python 如何根据ListField中嵌入的文档的ID mongoengine更新/删除该文档?

Python 如何根据ListField中嵌入的文档的ID mongoengine更新/删除该文档?,python,mongodb,updates,mongoengine,Python,Mongodb,Updates,Mongoengine,我有以下文件: class Note(EmbeddedDocument): value = mongo_db.StringField(max_length=200, required=True) id = mongo_db.UUIDField(required=True, primary_key=True) class Post(Document,): notes = mongo_db.ListField(mongo_db.EmbeddedDocumentField(

我有以下文件:

class Note(EmbeddedDocument):
    value = mongo_db.StringField(max_length=200, required=True)
    id = mongo_db.UUIDField(required=True, primary_key=True)


class Post(Document,):
    notes = mongo_db.ListField(mongo_db.EmbeddedDocumentField(Note))
如何在
Post
对象列表中为
Note
对象编写更新
字段的语句。换言之,如何编写符合以下要求的内容:

update(post_id, note_id, new_valye)
类似地,如何删除嵌入文档的实例
注意

delete(post_id, note_id)

有两种方法可以做到这一点,假设您想要更新列表的第二项(即在索引=1处):

1) 获取文档实例并使用
.save()

2) 如果您只需要更新文档的字段,并且知道其在数组中的位置,则可以使用:

Post.objects.update(set__notes__1__value='new_value')

首先,我编辑了我的
Post
文档,以获得
EmbeddedDocumentListField
的好处:

class Note(EmbeddedDocument):
    value = mongo_db.StringField(max_length=200, required=True)
    id = mongo_db.UUIDField(required=True, primary_key=True)


class Post(Document,):
    notes = mongo_db.EmbeddedDocumentListField(Note, required=False)
然后用于更新:

    Post.objects(
        id=post_id, 
        notes__id=note_id
    ).update(
            set__notes__S__value=my_value
    ) 
删除:

    Post.objects(id=post_id).update_one(
        pull__notes__id=note_id
    )

但我认为,这种方法存在一个问题,如果您正在更新许多字段,那么现在很难编写第一次更新。

谢谢,但我不知道它的索引和位置,我只知道它的ID。我澄清了它是嵌入文档而不是标量字段。请重新阅读问题。您的Notes类在示例中没有ID字段MongoEngine默认情况下会添加一个。不在嵌入字段中请参阅。我本想早些时候与你分享这个重复的问题,但意外地(只是短暂地)将你的问题分成了两个,变成了一个完全不相关的问题(因为我打开了多个选项卡,因为我没有立即获得链接,所以觉得重新打开是公平的)。答案就在那里,而且实际上在感谢@NeilLunn中,这很奇怪,虽然我搜索了很多次,但我没有找到这个问题,无论如何,我认为这会解决我的问题,但我认为你提到的文档部分没有关系。在这种情况下,@NeilLunn,我应该将问题标记为重复还是删除?它在我提供链接的文档“附近”中。但你需要“向下滚动”一点,直到它显示“更新”的地方。请特别注意,您将看到MongoDB在MongoEngine表达式(基于Django“ORM”语法)中无效。这就是“要点”。实际上,我不能“强迫关闭”你的问题“两次”(如前所述)。我也不确定你是否可以“自我关闭”,除非其他人“建议”类似的重复关闭。我一般认为没有必要删除。我个人认为,带有不同问题标题或提问方式略有不同的标记副本实际上是一件好事,因为不同的人可能以不同的方式表达相同的问题。因此,我个人喜欢各种各样的“重复”和“稍微”不同的提问方式。让其他人更容易得出相同的答案。
    Post.objects(id=post_id).update_one(
        pull__notes__id=note_id
    )