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

MongoDB findOneAndUpdate()

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.