2011-09-02 9 views
7

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? 

このようなことは正しいですか?

答えて

1

既存のコメントのインデックスを見つける必要があります。

あなたは、新しいコメント(が指数である)などで古いコメント上書きすることができます。

post.comments[i] = new_comment 

はその後、ちょうどpost.save()とmongoengineが$set操作にそれを変換しますか。

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

はあなたが埋め込まれた文書のリストの代わりにEmbeddedDocumentListFieldを使用することもできます。

代わりに、あなただけの$setなどを書くことができます。 更新を作成するには、いくつかのhandy methodsのようなフィルタへのアクセスを得るその方法、:

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) 

コメントはキー値の辞書でなければならないので、

+1

ノートのアップデートは、キーワード引数を取ります(コードがテストされていません)あなたが 'existing.update(** comment)'をアンパックするペア –

関連する問題