Der kan være andre måder at opnå dette på, men en tilgang er at versionere dine dokumenter og kun udstede opdateringer mod den version, som brugeren tidligere havde læst (dvs. sikre, at ingen andre har opdateret dokumentet, siden det sidst blev læst). Her er et kort eksempel på denne teknik, der bruger 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}
Bemærk i ovenstående, at nøglen "n" er 1, hvilket indikerer, at dokumentet blev opdateret
>>> 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}
her hvor vi forsøgte at opdatere mod den forkerte version, er nøglen "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}
Bemærk, at denne teknik er afhængig af at bruge sikker skrivning, ellers får vi ikke en bekræftelse, der angiver antallet af opdaterede dokumenter. En variation af dette ville bruge findAndModify
kommando, som enten returnerer dokumentet eller None
(i Python), hvis der ikke blev fundet noget dokument, der matcher forespørgslen. findAndModify
giver dig mulighed for at returnere enten den nye (dvs. efter opdateringer er anvendt) eller gamle version af dokumentet.