Mohou existovat jiné způsoby, jak toho dosáhnout, ale jedním přístupem je verze dokumentů a vydávání aktualizací pouze proti verzi, kterou si uživatel předtím přečetl (tj. zajistit, aby nikdo jiný dokument neaktualizoval od jeho posledního přečtení). Zde je krátký příklad této techniky pomocí 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}
poznamenejte si výše, klíč "n" je 1, což znamená, že dokument byl aktualizován
>>> 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}
zde, kde jsme se pokusili provést aktualizaci proti nesprávné verzi, je klíč "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}
Všimněte si, že tato technika spoléhá na použití bezpečného zápisu, jinak nedostaneme potvrzení o počtu aktualizovaných dokumentů. Varianta tohoto by používala findAndModify
příkaz, který buď vrátí dokument, nebo None
(v Pythonu), pokud nebyl nalezen žádný dokument odpovídající dotazu. findAndModify
umožňuje vrátit buď novou (tj. po použití aktualizací) nebo starou verzi dokumentu.