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

次に、 a を実行するだけで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 に答える