2012-03-11 15 views
0

私は、コレクション内の次のコードを持っている:find_another_document_and_update_it()インサイド更新文書 - mongoengine

class Author(Agent): 

    def foo(self): 
     self.find_another_document_and_update_it(ids) 
     self.processed = True 
     self.save() 

    def find_another_document_and_update_it(self, ids): 
     for id in ids: 
      documentA = Authors.objects(id=id) 
      documentA.update(inc__mentions=1) 

を私はデータベースを照会し、文書Aを取得し、私はその後、Aにカウンタをインクリメントを呼び出した後、find_another_document_and_update_it()を呼び出した後、私は現在の文書を保存してBと言うことができます。self.save()が呼び出されたときにAのカウンターが実際に増加することがわかりますが、文書Aは古い値にリセットされます。私は問題は並行性の問題とMongoDBがそれをどのように取り扱うかであると思います。私はあなたの助けに感謝します。

答えて

1

MongoEngine 0.5 saveは、以前の更新がfind_another_document_and_update_itであることを意味していた文書全体を保存する前に、変更されたフィールドのみを上書きします。一般的には、すべてのものがPythonと同じように明示的にすることをお勧めします。したがって、updateを使用してドキュメントを更新することをお勧めします。

あなたはすべてを単一の更新に言及更新できるようになります。

Authors.objects(id__in=ids).update(inc__mentions=1) 

にかかわらず、更新するための最良の方法は、self.save()後にグローバルな更新を呼び出すことであろう。こうすることで、変更内容を処理して保存した後でのみ、その件名が増分されます。

関連する問題