【问题标题】:What is the proper way to update a listfield of embedded documents in mongoengine?在 mongoengine 中更新嵌入文档的列表字段的正确方法是什么?
【发布时间】:2011-09-02 04:53:21
【问题描述】:

我正在尝试定义对 mongoengine 中嵌入文档的列表字段执行检查和更新的方法。做我想做的事情的正确方法是什么。代码如下。

class Comment(EmbeddedDocument):
    created = DateTimeField()
    text = StringField()

class Post(Document):
    comments = ListField(EmbeddedDocumentField(Comment))

    def check_comment(self, comment):
        for existing_comment in self.comments:
            if comment.created == existing_comment.created and 
                comment.text == existing_comment.text:
                return True
        return False

    def add_or_replace_comment(self, comment):
        for existing_comment in self.comments:
            if comment.created == existing_comment.created:
                # how do I replace?

        # how do I add?

这甚至是处理此类事情的正确方法吗?

【问题讨论】:

    标签: python mongoengine


    【解决方案1】:

    你需要找到现有评论的索引。

    然后您可以用新评论(其中 i 是索引)覆盖旧评论,例如:

    post.comments[i] = new_comment
    

    然后只需执行 post.save() 并且 mongoengine 会将其转换为 $set 操作。

    或者,您可以只写$set 例如:

    Post.objects(pk=post.pk).update(set__comments__i=comment)
    

    【讨论】:

      【解决方案2】:

      您可以使用 EmbeddedDocumentListField 代替嵌入文档的列表。这样您就可以访问一些handy methods,例如 filtercreateupdate

      class Comment(EmbeddedDocument):
          created = DateTimeField()
          text = StringField()
      
      class Post(Document):
          comments = EmbeddedDocumentListField(Comment)
      
          ...
      
          def add_or_replace_comment(self, comment):
              existing = self.comments.filter(created=comment.created)
              if existing.count() == 0:
                   self.comments.create(comment)
              else:
                   existing.update(comment)
      

      (代码未测试)

      【讨论】:

      • note update 接受关键字参数,因此comment 必须是您解压的键值对字典existing.update(**comment)
      猜你喜欢
      • 2015-01-12
      • 2012-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-19
      • 2016-08-02
      相关资源
      最近更新 更多