Ich bin ein bisschen verwirrt von der findAndModify
Methode in MongoDB. Was ist der Vorteil gegenüber der update
Methode? Für mich scheint es, dass es nur das Element zuerst zurückgibt und es dann aktualisiert. Aber warum muss ich den Artikel zuerst zurückgeben? Ich habe die MongoDB gelesen : die endgültige Anleitung und sie besagt, dass sie praktisch ist, um Warteschlangen zu manipulieren und andere Operationen auszuführen, die eine Atomizität im Get-and-Set-Stil erfordern. Aber ich habe nicht verstanden, wie das erreicht wird. Kann mir das jemand erklären?
175
findAndModify
sichergestellt werden, dass kein anderer Aktualisierungsvorgang den Vorgang stört?findAndModify
gibt das Dokument zurück, die Aktualisierung nicht.Wenn ich Dwight Merriman (einen der ursprünglichen Autoren von mongoDB) richtig verstanden habe, ist die Verwendung von update zum Ändern eines einzelnen Dokuments, dh ("multi": false}, ebenfalls atomar. Derzeit sollte es auch schneller sein als das entsprechende Update mit
findAndModify
.quelle
Aus den MongoDB-Dokumenten (Hervorhebung hinzugefügt):
quelle
findAndModify()
standardmäßig nur ein Dokument ändert undupdate()
ein oder mehrere Dokumente aktualisieren kann, wenn ich ein verwendearrayFilters
,findAndModify()
alle Übereinstimmungen aktualisiert werden. Vielleicht ist es ein Fehler?Eine nützliche Klasse von Anwendungsfällen sind Zähler und ähnliche Fälle. Schauen Sie sich zum Beispiel diesen Code an (einen der MongoDB-Tests): find_and_modify4.js .
Somit wird mit
findAndModify
den Zählern erhöht und in einem Schritt seinen inkrementierten Wert. Vergleichen Sie: Wenn Sie (A) diese Operation in zwei Schritten ausführen und jemand anderes (B) dieselbe Operation zwischen Ihren Schritten ausführt, erhalten A und B möglicherweise denselben letzten Zählerwert anstelle von zwei verschiedenen (nur ein Beispiel für mögliche Probleme).quelle
Wir haben findAndModify () für Counter-Operationen (inc oder dec) verwendet und andere Einzelfelder mutieren Fälle. Bei der Migration unserer Anwendung von Couchbase nach MongoDB habe ich festgestellt, dass diese API den Code für GetAndlock () ersetzt, den Inhalt lokal ändert, replace () zum Speichern und Get () erneut zum Abrufen des aktualisierten Dokuments. Bei mongoDB habe ich nur diese einzelne API verwendet, die das aktualisierte Dokument zurückgibt.
quelle