Може да има други начини да постигнете това, но един подход е да създадете версия на вашите документи и да издадете актуализации само срещу версията, която потребителят е прочел преди това (т.е. да се уверите, че никой друг не е актуализирал документа от последното му четене). Ето кратък пример за тази техника с помощта на 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
ви позволява да върнете или новата (т.е. след прилагане на актуализациите), или старата версия на документа.