Upsert in MongoDB

Shihab Sikder 20 Juni 2023
  1. die upsert-Abfrage in MongoDB
  2. Verwenden Sie die upsert-Abfrage mit der update()-Methode
  3. Verwenden Sie die upsert-Abfrage mit der findAndModify()-Methode
  4. Andere Methoden, die upsert unterstützen
Upsert in MongoDB

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.

Shihab Sikder avatar Shihab Sikder avatar

I'm Shihab Sikder, a professional Backend Developer with experience in problem-solving and content writing. Building secure, scalable, and reliable backend architecture is my motive. I'm working with two companies as a part-time backend engineer.

LinkedIn Website