我在集合中有以下代码:
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如何处理它有关。感谢您的帮助。
答案 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()
之后调用全局更新。这样,只有在处理完并保存了任何更改后,才会增加提及。