Для этого могут быть другие способы, но один из подходов заключается в том, чтобы создавать версии ваших документов и выпускать обновления только для той версии, которую пользователь ранее прочитал (т. Е. Убедиться, что никто другой не обновил документ с момента его последнего использования).читать).Вот краткий пример этой техники с использованием pymongo:
>>> db.foo.save({'_id': 'a', 'version': 1, 'things': []}, safe=True)
'a'
>>> db.foo.update({'_id': 'a', 'version': 1}, {'$push': {'things': 'thing1'}, '$inc': {'version': 1}}, safe=True)
{'updatedExisting': True, 'connectionId': 112, 'ok': 1.0, 'err': None, 'n': 1}
Обратите внимание, что ключ "n" равен 1, указывая, что документ был обновлен
>>> db.foo.update({'_id': 'a', 'version': 1}, {'$push': {'things': 'thing2'}, '$inc': {'version': 1}}, safe=True)
{'updatedExisting': False, 'connectionId': 112, 'ok': 1.0, 'err': None, 'n': 0}
здесь, где мы пыталисьдля обновления с неверной версией ключ "n" равен 0
>>> db.foo.update({'_id': 'a', 'version': 2}, {'$push': {'things': 'thing2'}, '$inc': {'version': 1}}, safe=True)
{'updatedExisting': True, 'connectionId': 112, 'ok': 1.0, 'err': None, 'n': 1}
>>> db.foo.find_one()
{'things': ['thing1', 'thing2'], '_id': 'a', 'version': 3}
Обратите внимание, что этот метод основан на использовании безопасных записей, в противном случае мы не получим подтверждение, указывающее количество обновленных документов.Вариант этого будет использовать команду findAndModify
, которая будет либо возвращать документ, либо None
(в Python), если документ, соответствующий запросу, не найден.findAndModify
позволяет вернуть либо новую (т.е. после применения обновлений), либо старую версию документа.