Mogą istnieć inne sposoby osiągnięcia tego celu, ale jednym z podejść jest tworzenie wersji dokumentów i publikowanie aktualizacji tylko w stosunku do wersji, którą użytkownik wcześniej przeczytał (tj. Upewnij się, że nikt inny nie zaktualizował dokumentu od czasu ostatniego czytania). Oto krótki przykład tej techniki przy użyciu 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}
uwaga powyżej, klucz "n" to 1, co oznacza, że dokument został zaktualizowany
>>> 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}
tutaj, gdzie próbowaliśmy zaktualizować z niewłaściwą wersją, klucz "n" to 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}
Zauważ, że ta technika opiera się na bezpiecznym zapisie, w przeciwnym razie nie otrzymamy potwierdzenia wskazującego liczbę zaktualizowanych dokumentów. Odmianą tego byłoby użycie findAndModify
polecenie, które albo zwróci dokument, albo None
(w Pythonie), jeśli nie znaleziono dokumentu pasującego do zapytania. findAndModify
umożliwia zwrócenie nowej (tj. po zastosowaniu aktualizacji) lub starej wersji dokumentu.