MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB-Dokumentoperationen sind atomar und isoliert, aber sind sie konsistent?

Möglicherweise gibt es andere Möglichkeiten, dies zu erreichen, aber ein Ansatz besteht darin, Ihre Dokumente zu versionieren und Aktualisierungen nur für die Version herauszugeben, die der Benutzer zuvor gelesen hat (d. h. sicherzustellen, dass niemand anderes das Dokument aktualisiert hat, seit es zuletzt gelesen wurde). Hier ist ein kurzes Beispiel für diese Technik mit 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}

Beachten Sie, dass der Schlüssel "n" oben 1 ist, was anzeigt, dass das Dokument aktualisiert wurde

>>> 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, wo wir versucht haben, gegen die falsche Version zu aktualisieren, ist der Schlüssel "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}

Beachten Sie, dass diese Technik auf der Verwendung sicherer Schreibvorgänge beruht, andernfalls erhalten wir keine Bestätigung, die die Anzahl der aktualisierten Dokumente angibt. Eine Variation davon würde den findAndModify verwenden Befehl, der entweder das Dokument zurückgibt, oder None (in Python), wenn kein zur Abfrage passendes Dokument gefunden wurde. findAndModify ermöglicht es Ihnen, entweder die neue (d. h. nachdem Updates angewendet wurden) oder die alte Version des Dokuments zurückzugeben.