Die MongoDB $setOnInsert
Feldaktualisierungsoperator kann verwendet werden, um einen bestimmten Wert während eines Upsert einzufügen.
Wenn ein Aktualisierungsvorgang dazu führt, dass ein neues Dokument eingefügt wird (d. h. ein Upsert), dann wird der $setOnInsert
Operator wirksam, sonst hat er keine Wirkung.
Beispiel
Angenommen, wir haben eine Sammlung namens dogs
mit folgendem Dokument:
{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 }
Und wir führen das folgende update()
aus Befehl zum Aktualisieren eines Dokuments, das nicht in der Sammlung vorhanden ist:
db.dogs.update(
{ _id: 2 },
{
$set: { weight: 50, height: 40 },
$setOnInsert: { name: "Bark" }
},
{ upsert: true }
)
Dies führt zu folgender Ausgabe:
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 2 })
Was uns sagt, dass ein Dokument eingefügt wurde.
Sehen wir uns die Sammlung an:
db.dogs.find()
Ergebnis:
{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 } { "_id" : 2, "height" : 40, "name" : "Bark", "weight" : 50 }
Wir können sehen, dass Dokument 2 eingefügt wurde und das Feld/den Wert enthält, den wir für $setOnInsert
bereitgestellt haben Operator (z.B. name: "Bark"
).
Wenn das Dokument existiert (d. h. kein Upsert)
Versuchen wir nun, das gerade eingefügte Dokument zu aktualisieren. Verwenden wir dieselbe Anweisung wie im vorherigen Beispiel, jedoch mit anderen Werten.
db.dogs.update(
{ _id: 2 },
{
$set: { weight: 55, height: 45 },
$setOnInsert: { name: "Fluffy" }
},
{ upsert: true }
)
Ausgabe:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Dieses Mal stimmte ein Dokument überein und wurde aktualisiert. Es wurde nichts nachgebessert.
Sehen wir uns die Sammlung noch einmal an.
db.dogs.find()
Ergebnis:
{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 } { "_id" : 2, "height" : 45, "name" : "Bark", "weight" : 55 }
In diesem Fall also das weight
und height
Felder wurden aktualisiert, aber der name
Feld war nicht.
Das Namensfeld wurde nicht aktualisiert, weil kein Upsert durchgeführt wurde. Der $setOnInsert
Der Operator gibt nur das einzustellende Feld/den Wert an, wenn die Aktualisierungsoperation dazu führt, dass ein neues Dokument eingefügt wird (d. h. ein Upsert).