【问题标题】:How to update/delete embeded document in ListField based on its ID mongoengine?如何根据 ID mongoengine 更新/删除列表字段中的嵌入文档?
【发布时间】:2019-10-21 16:02:39
【问题描述】:

我有以下文件:

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 对象的value 字段。换句话说,如何编写执行以下操作的内容:

update(post_id, note_id, new_valye)

以类似的方式,我如何删除嵌入文档Note 的实例:

delete(post_id, note_id)

【问题讨论】:

  • 见Updating a embedded documents in mongoengine。我本来打算早先与您分享重复的问题,但不小心(只是简单地)将您的问题重复关闭为一个完全不相关的问题(因为我打开了多个标签,感觉重新打开是公平的,因为我没有立即获得链接)。答案就在那里,而且实际上在mongoengine documentation
  • 谢谢@NeilLunn,这很奇怪,虽然我搜索了多次,但我找不到这个问题,无论如何,我认为这会解决我的问题,但我认为你提到的文档部分是不相关。
  • 在这种情况下还有@NeilLunn,我应该将问题标记为重复还是删除它?
  • 它在我提供链接的“附近”文档中。但是您需要稍微“向下滚动”到显示“更新”的位置。请特别注意,您将看到 MongoDB positional $ operator, 在 MongoEngine 表达式(基于 Django“ORM”语法)中无效。无论如何,这就是“要点”。我实际上不能“两次”“强制关闭”您的问题(如前所述)。也不确定您是否可以“自行关闭”,除非其他人“建议”类似的重复关闭。
  • 我一般认为不需要删除。我个人认为用不同的问题标题或稍微不同的方式提出相同问题的标记重复实际上是一件好事,因为不同的人可能会以不同的方式表达相同的问题。所以我个人喜欢各种“重复”的“稍微”不同的询问方式。让其他人更容易得出相同的答案。

标签: python mongodb updates mongoengine


【解决方案1】:

首先我编辑了我的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
    )

但我认为,这种方法有一个问题,如果你要更新很多字段,现在第一次更新很难写。

【讨论】:

    【解决方案2】:

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

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

    post = Post.objects().first()
    post.notes[1].value = 'new_value'
    post.save()
    

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

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

    【讨论】:

    • 谢谢,但我不知道它的索引也不知道它的位置,我只知道它的ID。我澄清说它是嵌入文档而不是标量字段,请再次阅读问题。
    • 您的 Note 类在您的示例中没有 Id 字段
    • Mongoengine默认加一个。
    • 不在嵌入字段中
    猜你喜欢
    • 2015-01-12
    • 1970-01-01
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多