sql >> Database >  >> NoSQL >> MongoDB

MongoDB-documentbewerkingen zijn atomair en geïsoleerd, maar zijn ze consistent?

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.



  1. Hoe kan ik twee versies van mongodb parallel installeren in Ubuntu 12.04?

  2. MongoDB GridFS - Is het bestandsnaam of bestandsnaam?

  3. CURSOR_NOT_FOUND - mijn cron-jobs begonnen halverwege te sterven

  4. Hoe vraag ik een reeks woordenboeken in MongoDB op?