Обновить документ из другого документа - mongoengine - PullRequest
0 голосов
/ 11 марта 2012

У меня есть следующий код в коллекции:

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 Ответ

1 голос
/ 12 марта 2012

В MongoEngine 0.5 save обновляются только те поля, которые изменились - до того, как он сохранил весь документ, это означало бы, что предыдущее обновление в find_another_document_and_update_it было бы перезаписано.В целом, как и в случае с Python, лучше быть явным, поэтому вы можете использовать update для обновления документа.

Вы можете обновить все упоминания с помощью одного обновления:

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

Независимо от этого, лучшим способом обновления будет вызов глобальных обновлений после self.save().Таким образом, упоминания увеличиваются только после того, как вы обработали и сохранили любые изменения.

...