在mongoengine中更新嵌入文档列表字段的正确方法是什么?

时间:2011-09-02 04:53:22

标签: python mongoengine

我正在尝试定义对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?

这甚至是正确的方法吗?

2 个答案:

答案 0 :(得分:1)

您可以使用EmbeddedDocumentListField而不是嵌入文档列表。这样您就可以访问某些handy methods,例如过滤器创建更新

Object

(代码未经测试)

答案 1 :(得分:0)

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

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

post.comments[i] = new_comment

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

或者,你可以写$set例如:

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