0

コレクションに次のコードがあります。

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)

内部find_another_document_and_update_it()では、データベースにクエリを実行してドキュメントAを取得し、次にAのカウンターをインクリメントします。次にfoo()、を呼び出した後find_another_document_and_update_it()、現在のドキュメントも保存します。たとえば、Bと言います。問題は、Aのカウンターがが呼び出されると実際に増加しself.save()、ドキュメントAは古い値にリセットされます。問題は、並行性の問題と、MongoDBがそれをどのように処理するかに関係していると思います。私はあなたの助けに感謝します。

4

1 に答える 1

1

MongoEngine 0.5 ではsave、変更されたフィールドのみを更新します。ドキュメント全体を保存する前に、以前の更新find_another_document_and_update_itが上書きされていた可能性があります。一般的に、すべての python と同様に、明示的である方がよいためupdate、ドキュメントを更新するために使用することができます。

1 回の更新ですべてのメンションを更新できるはずです。

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

いずれにせよ、更新する最善の方法は、 の後にグローバル更新を呼び出すことself.save()です。そうすれば、メンションは、変更を処理して保存した後にのみインクリメントされます。

于 2012-03-12T16:45:35.303 に答える