6

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

这甚至是做这种事情的正确方法吗?

4

2 回答 2

1

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

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

post.comments[i] = new_comment

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

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

Post.objects(pk=post.pk).update(set__comments__i=comment)
于 2012-01-31T10:06:44.050 回答
1

您可以使用 EmbeddedDocumentListField 而不是嵌入文档的列表。这样您就可以访问一些方便的方法,例如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)

(代码未测试)

于 2016-02-24T10:16:25.367 回答