从另一个文档内部更新文档 - mongoengine

时间:2012-03-11 09:40:08

标签: mongodb 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)

find_another_document_and_update_it()内部我查询数据库并检索文档A.然后我在A中增加一个计数器。然后在foo()中,在调用find_another_document_and_update_it()之后,我还保存当前文档让我们说B.问题是虽然我可以看到A中的计数器实际上在调用self.save()时增加,但文档A被重置为其旧值。我想这个问题与并发问题以及MongoDB如何处理它有关。感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

在MongoEngine 0.5中save仅更新已更改的字段 - 在保存整个文档之前,这意味着find_another_document_and_update_it中的先前更新将被覆盖。一般而言,与python的所有内容一样,最好是明确的 - 因此您可能希望使用update来更新文档。

您应该可以通过一次更新来更新所有提及:

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

无论如何,更新的最佳方式是在self.save()之后调用全局更新。这样,只有在处理完并保存了任何更改后,才会增加提及。