Det kan finnas andra sätt att åstadkomma detta, men ett tillvägagångssätt är att versionera dina dokument och utfärda uppdateringar mot endast den version som användaren tidigare läst (dvs. se till att ingen annan har uppdaterat dokumentet sedan det senast lästes). Här är ett kort exempel på denna teknik som använder 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}
notera i ovanstående, nyckel "n" är 1, vilket indikerar att dokumentet har uppdaterats
>>> 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}
här där vi försökte uppdatera mot fel version är nyckeln "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}
Observera att denna teknik är beroende av att använda säkra skrivningar, annars får vi ingen bekräftelse som anger antalet uppdaterade dokument. En variant av detta skulle använda findAndModify
kommando, som antingen returnerar dokumentet eller None
(i Python) om inget dokument som matchar frågan hittades. findAndModify
låter dig returnera antingen den nya (dvs. efter att uppdateringar har tillämpats) eller gamla versionen av dokumentet.