sql >> Database teknologi >  >> NoSQL >> MongoDB

MongoDB-dokumentoperationer er atomare og isolerede, men er de konsistente?

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.



  1. Begrænser du resultater i MongoDB, men får du stadig hele optællingen?

  2. Async Bulk (batch) indsæt til MySQL (eller MongoDB?) via Node.js

  3. Inkluder alle eksisterende felter og tilføj nye felter til dokumentet

  4. tilpasset redis-klient kompilering mislykkes