Er kunnen andere manieren zijn om dit te bereiken, maar een van de manieren is om uw documenten te versies en updates uit te geven tegen alleen de versie die de gebruiker eerder had gelezen (d.w.z. ervoor zorgen dat niemand anders het document heeft bijgewerkt sinds het voor het laatst werd gelezen). Hier is een kort voorbeeld van deze techniek met 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}
noteer in het bovenstaande, sleutel "n" is 1, wat aangeeft dat het document is bijgewerkt
>>> 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}
hier waar we probeerden te updaten tegen de verkeerde versie, sleutel "n" is 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}
Merk op dat deze techniek afhankelijk is van het gebruik van veilige schrijfbewerkingen, anders krijgen we geen bevestiging met vermelding van het aantal bijgewerkte documenten. Een variatie hierop zou de findAndModify
gebruiken
commando, waarmee het document wordt geretourneerd, of None
(in Python) als er geen document is gevonden dat overeenkomt met de zoekopdracht. findAndModify
stelt u in staat om de nieuwe (d.w.z. nadat updates zijn toegepast) of de oude versie van het document terug te geven.