MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB $setOnInsert

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).