In MongoDB die db.collection.findOneAndUpdate()
aktualisiert ein einzelnes Dokument basierend auf dem filter
und sort
Kriterien.
Die collection
part ist der Name der Sammlung, mit der die Operation durchgeführt werden soll.
Beispiel
Angenommen, wir haben eine Sammlung namens pets
die folgende Dokumente enthält:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Wir können db.collection.findOneAndUpdate()
verwenden Methode, um eines dieser Dokumente zu aktualisieren.
db.pets.findOneAndUpdate(
{ "type": "Dog" },
{ $set: { "type": "Cow" } }
)
Ergebnis:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" }
Standardmäßig wird das Originaldokument zurückgegeben (nicht die geänderte Version).
Beachten Sie, dass nur ein Hund aktualisiert wurde, obwohl die Sammlung zwei Hunde enthält.
Sehen wir uns die Sammlung an.
db.pets.find()
Ergebnis:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Wir können sehen, dass das erste Dokument jetzt eine Kuh anstelle eines Hundes enthält.
Senden Sie das geänderte Dokument zurück
Standardmäßig wird das Originaldokument zurückgegeben, wenn Sie db.collection.findOneAndUpdate()
verwenden .
Wenn Sie stattdessen lieber das geänderte Dokument zurückgeben möchten, verwenden Sie returnNewDocument
Parameter.
Lassen Sie uns eine weitere Änderung vornehmen, aber dieses Mal verwenden wir returnNewDocument: true
.
db.pets.findOneAndUpdate(
{ "type": "Dog" },
{ $set: { "type": "Horse" } },
{ returnNewDocument: true }
)
Ergebnis:
{ "_id" : 2, "name" : "Bark", "type" : "Horse" }
Diesmal wurde der andere Hund aktualisiert. In diesem Fall haben wir es in ein Pferd geändert, und wir können sehen, dass das Rückgabedokument dies widerspiegelt.
Upserts
Ein Upsert ist eine Option, die Sie für Aktualisierungsvorgänge verwenden können. Wenn das angegebene Dokument nicht existiert, wird ein neues eingefügt. Wenn es geht existieren, dann wird das Originaldokument aktualisiert (und kein Dokument eingefügt).
Sie können Upserts ausführen, indem Sie upsert: true
angeben .
Beispiel mit upsert: false
Zuerst ist hier ein Beispiel für den Versuch, ein nicht vorhandenes Dokument zu aktualisieren, wenn upsert: false
.
db.pets.findOneAndUpdate(
{ "_id": 4 },
{ $set: { "name": "Barry", "type": "Badger" } },
{
returnNewDocument: true
}
)
Ergebnis:
null
Das Dokument existierte nicht in der Sammlung und daher findOneAndUpdate()
gab null
zurück . Obwohl wir upsert: false
nicht angegeben haben , wir wissen, dass es falsch war, weil dies der Standardwert ist (d. h. das ist der Wert, der verwendet wird, wenn Sie keine Upsert-Option angeben).
Wenn wir einen weiteren Blick in die Sammlung werfen, können wir sehen, dass das Dokument nicht upsertiert wurde.
db.pets.find()
Ergebnis:
{ "_id" : 1, "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Horse" } { "_id" : 3, "name" : "Scratch", "type" : "Cat" }
Beispiel mit upsert: true
Hier ist es wieder, aber diesmal geben wir upsert: true
an .
db.pets.findOneAndUpdate(
{ "_id": 4 },
{ $set: { "name": "Barry", "type": "Badger" } },
{
upsert: true,
returnNewDocument: true
}
)
Ergebnis:
{ "_id" : 4, "name" : "Barry", "type" : "Badger" }
Dieses Mal wird ein neues Dokument eingefügt und wir sehen das eingefügte Dokument als Ausgabe (weil wir returnNewDocument: true
angegeben haben ).
Sehen wir uns die Sammlung noch einmal an.
db.pets.find()
Ergebnis:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Horse" } { "_id" : 3, "name" : "Meow", "type" : "Cat" } { "_id" : 4, "name" : "Barry", "type" : "Badger" }
Wir können also sehen, dass das neue Dokument tatsächlich eingefügt wurde.
Die arrayFilters
Parameter
Wenn Sie mit Arrays arbeiten, können Sie die arrayFilters
verwenden Parameter zusammen mit dem positionellen $
-Operator, um zu bestimmen, welche Array-Elemente aktualisiert werden sollen. Dadurch können Sie ein Array-Element basierend auf seinem Wert aktualisieren, selbst wenn Sie seine Position nicht kennen.
Angenommen, wir haben eine Sammlung namens players
mit folgenden Dokumenten:
{ "_id" : 1, "scores" : [ 1, 5, 3 ] } { "_id" : 2, "scores" : [ 8, 17, 18 ] } { "_id" : 3, "scores" : [ 15, 11, 8 ] }
Wir könnten die folgende Abfrage ausführen, um nur die Array-Elemente zu aktualisieren, deren Wert höher als ein bestimmter Betrag ist (in diesem Fall 10).
db.players.findOneAndUpdate(
{ scores: { $gte: 10 } },
{ $set: { "scores.$[e]" : 10 } },
{
arrayFilters: [ { "e": { $gte: 10 } } ]
}
)
Ergebnis:
{ "_id" : 2, "scores" : [ 8, 17, 18 ] }
Dies zeigt das Dokument, bevor es aktualisiert wurde. Dadurch wird erwartungsgemäß nur ein Dokument aktualisiert, obwohl zwei Dokumente den Kriterien entsprechen.
So sehen die Dokumente jetzt aus.
db.players.find()
Ergebnis:
{ "_id" : 1, "scores" : [ 1, 5, 3 ] } { "_id" : 2, "scores" : [ 8, 10, 10 ] } { "_id" : 3, "scores" : [ 15, 11, 8 ] }
In Dokument 2 wurden zwei Array-Elemente aktualisiert, da diese Elemente den Kriterien entsprachen.
Weitere Informationen
Die db.collection.findOneAndUpdate()
-Methode akzeptiert auch andere Parameter wie projection
(um eine Teilmenge der zurückzugebenden Felder anzugeben), sort
, maxTimeMS
und collation
.
Siehe die MongoDB-Dokumentation für db.collections.findOneAndUpdate()
für weitere Informationen.