HOWTO · MongoDB

Upsert in MongoDB

Upsert ist eine Option, die für den Aktualisierungsvorgang verwendet wird. Es nimmt einen booleschen Parameter und erstellt ein Dokument, wenn es keine Übereinstimmungen für die Abfrage gibt. Sie können es mit den Methoden update, updateOne, replaceOne und findAndModify verwenden.

Auf dieser Seite

In MongoDB kombiniert upsert die Befehle update und insert. Es kann in den Operationen update() und findAndModify() verwendet werden.

die upsert-Abfrage in MongoDB

upsert nimmt einen einzelnen booleschen Parameter. Wenn es auf TRUE gesetzt ist und ein Abfragedokument gefunden wird, wird es das Dokument aktualisieren; wenn es nicht gefunden wird, fügt es ein neues Dokument in die Sammlung ein.

Syntax:

upsert: <boolean>

Verwenden Sie die upsert-Abfrage mit der update()-Methode

Angenommen, Sie haben das folgende Dokument für den Mitarbeiter. Um die Dokumente anzuzeigen, geben Sie den folgenden Befehl in Mongosh oder MongoCLI ein (nachdem Sie sich erfolgreich mit der Datenbank verbunden haben):

> db.employee.find().pretty()
{"_id":1,   "name":"Alice"}
{"_id":2,   "name":"Bob"}

Hier wird find() zum Suchen von Dokumenten oder Objekten verwendet. Wir können ihm auch Parameter übergeben.

Wenn Sie beispielsweise find({"_id":1}) schreiben, wird nur das Objekt mit der ID 1 zurückgegeben. pretty() dient zum Drucken der Ausgabe in einem schönen Format.

Wenn Sie nun versuchen, wie folgt zu aktualisieren:

> db.employee.update({_id:5},{name: "Jhon"})
WriteResult({"nMatched": 0,  "nUpserted": 0, "nModified": 0})

Wie wir dem WriteResult entnehmen können, wurde kein Dokument aktualisiert. Probieren Sie nun die Option upsert mit dem Wert TRUE aus.

Angenommen, Sie möchten nach einem Namen suchen und ihn aktualisieren. Sie möchten beispielsweise alle Namen Sam mit der Option upsert in Samuel aktualisieren.

Die Abfrage sieht wie folgt aus:

> db.employee.update({name:"Sam"},{name: "Samuel"})
WriteResult({
    "nMatched": 0,  
    "nUpserted": 1, 
    "nModified": 0,
    "_id": ObjectId("67874504aed8aee9986")
})
>

Hier sehen Sie, dass der upserted-Wert 1 ist. Da es keine Übereinstimmung für den Namen Sam gibt, wurde eine Entität mit einer eindeutigen _id dafür erstellt.

Wenn Sie nun alle Entitäten unter Mitarbeiter anzeigen möchten, können Sie die folgende Abfrage ausführen:

> db.employee.find().pretty()
{"_id":1,   "name":"Alice"}
{"_id":2,   "name":"Bob"}
{"_id":ObjectId("67874504aed8aee9986"),   "name":"Samuel"}
>

Verwenden Sie die upsert-Abfrage mit der findAndModify()-Methode

Diese Methode funktioniert genauso wie die Methode update(), aber findAndModify aktualisiert nur das erste übereinstimmende Objekt, während update alle übereinstimmenden Entitäten ändert.

Angenommen, wir möchten ein neues Feld hinzufügen, dessen ID gleich 3 ist. Wir werden Folgendes schreiben:

db.employee.findAndModify({query: {_id:3}, update:{$inc: {salary: 1500}}, upsert: true})
null
>

Es gibt null zurück, weil es nie existiert hat.

Wenn wir alle Entitäten anzeigen, können wir sehen, dass ein neues Objekt zu den Dokumenten hinzugefügt wird, da das upsert auf TRUE gesetzt wurde. Es fügte eine neue Entität mit einer ID von 3 und einem Gehalt von 1500 hinzu.

> db.employee.find().pretty()
{"_id":1,   "name":"Alice"}
{"_id":2,   "name":"Bob"}
{"_id":ObjectId("67874504aed8aee9986"),   "name":"Samuel"}
{"_id":5,   "salary":"1500"}

Andere Methoden, die upsert unterstützen

Wir können die Option upsert auch in den folgenden Methoden verwenden:

  1. updateOne()
  2. replaceOne()

Sie können diesen Blog besuchen, um mehr zu erfahren. Hier ist auch die offizielle Dokumentation von MongoDB.