webentwicklung-frage-antwort-db.com.de

Was ist der Unterschied zwischen replaceOne () und updateOne () in MongoDB?

Für MongoDB-Massenvorgänge stehen zwei Optionen zur Verfügung:

  1. Bulk.find.updateOne()

    Fügt einer Massenoperationsliste eine einzelne Dokumentaktualisierungsoperation hinzu. Die Operation kann entweder ein vorhandenes Dokument ersetzen oder bestimmte Felder in einem vorhandenen Dokument aktualisieren.

  2. Bulk.find.replaceOne()

    Fügt einer Massenoperationsliste eine einzelne Dokumentersetzungsoperation hinzu. Verwenden Sie die Bulk.find() -Methode, um die Bedingung anzugeben, die bestimmt, welches Dokument ersetzt werden soll. Die Bulk.find.replaceOne() -Methode beschränkt das Ersetzen auf ein einzelnes Dokument.

Beide Methoden können laut Dokumentation ein übereinstimmendes Dokument ersetzen. Verstehe ich richtig, dass updateOne() eine allgemeinere Methode ist, die entweder das Dokument genau wie replaceOne() ersetzen kann oder nur seine spezifischen Felder aktualisiert?

39
Mike B.

Mit replaceOne() können Sie nur das gesamte Dokument ersetzen, während updateOne() das Aktualisieren von Feldern ermöglicht.

Da replaceOne() das gesamte Dokument ersetzt, gehen Felder im alten Dokument, die nicht im neuen enthalten sind, verloren. Mit updateOne() können neue Felder hinzugefügt werden, ohne die Felder im alten Dokument zu verlieren.

Zum Beispiel, wenn Sie folgendes Dokument haben:

{
   "_id" : ObjectId("0123456789abcdef01234567"),
   "my_test_key3" : 3333
}

Verwenden von:

replaceOne({"_id" : ObjectId("0123456789abcdef01234567")}, { "my_test_key4" : 4})

ergebnisse in:

{
   "_id" : ObjectId("0123456789abcdef01234567"),
   "my_test_key4" : 4.0
}

Verwenden von:

updateOne({"_id" : ObjectId("0123456789abcdef01234567")}, {$set: { "my_test_key4" : 4}})

ergebnisse in:

{
   "_id" : ObjectId("0123456789abcdef01234567"),
   "my_test_key3" : 3333.0,
   "my_test_key4" : 4.0
}

Beachten Sie, dass Sie mit updateOne()Aktualisierungsoperatoren für Dokumente verwenden können.

44
Hughzi

replaceOne() ersetzt das gesamte Dokument, während updateOne() das Aktualisieren oder Hinzufügen von Feldern ermöglicht. Bei Verwendung von updateOne() haben Sie auch Zugriff auf die Aktualisierungsoperatoren , mit denen Aktualisierungen an Dokumenten zuverlässig durchgeführt werden können. Zum Beispiel können zwei Clients "gleichzeitig" einen Wert im selben Feld im selben Dokument erhöhen, und beide Erhöhungen werden erfasst, während beim Ersetzen die eine die andere überschreiben kann, wodurch möglicherweise eine der Erhöhungen verloren geht.

Da replaceOne() das gesamte Dokument ersetzt, gehen Felder im alten Dokument, die nicht im neuen enthalten sind, verloren. Mit updateOne() können neue Felder hinzugefügt werden, ohne die Felder im alten Dokument zu verlieren.

Zum Beispiel, wenn Sie folgendes Dokument haben:

{
   "_id" : ObjectId("0123456789abcdef01234567"),

   "my_test_key3" : 3333
}

Verwenden von:

replaceOne({"_id" : ObjectId("0123456789abcdef01234567")}, { "my_test_key4" : 4})

ergebnisse in:

{
   "_id" : ObjectId("0123456789abcdef01234567"),
   "my_test_key4" : 4.0
}

Verwenden von:

updateOne({"_id" : ObjectId("0123456789abcdef01234567")}, {$set: { "my_test_key4" : 4}})

ergebnisse in:

{
   "_id" : ObjectId("0123456789abcdef01234567"),
   "my_test_key3" : 3333.0,
   "my_test_key4" : 4.0
}
3
Jurgen Strydom

db.collection.replaceOne() macht genau das Gleiche wie db.collection.updateOne().

Der Hauptunterschied besteht darin, dass die Daten von db.collection.replaceOne(), die bearbeitet werden, zum Server hin und her gehen müssen, wohingegen db.collection.UpdateOne() nur die gefilterten und nicht das gesamte Dokument anfordert!

0
Evangelos