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

MongoDB findAndModify()

In MongoDB die db.collection.findAndModify() Methode modifiziert ein einzelnes Dokument und gibt es zurück.

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.findAndModify() verwenden Methode, um eines dieser Dokumente zu ändern.

db.pets.findAndModify({
    query: { type: "Dog" },
    update: { 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, "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. Wir können jedoch auch sehen, dass das Namensfeld des Dokuments verschwunden ist.

Denn wenn Sie ein Dokument an update übergeben Argument, db.collection.findAndModify() führt einen Austausch durch.

Einen Aktualisierungsoperator verwenden

Wenn wir ein Feld aktualisieren, aber den Rest des Dokuments intakt lassen wollten, müssten wir den/die relevanten Update-Operatorausdruck/e in unser Dokument aufnehmen.

Lassen Sie uns mit der Sammlung in ihrem aktuellen Zustand ein weiteres findAndModify() ausführen Operation dagegen, aber dieses Mal verwenden wir den $set update-Operator, um nur das Feld festzulegen, das wir ändern möchten.

db.pets.findAndModify({
    query: { type: "Dog" },
    update: { $set: { type: "Horse" } }
})

Ergebnis:

{ "_id" : 2, "name" : "Bark", "type" : "Dog" }

Diesmal wurde der verbleibende Hund aktualisiert.

Werfen wir einen Blick auf die Sammlung.

db.pets.find()

Ergebnis:

{ "_id" : 1, "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Horse" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }

Diesmal wurde das relevante Feld aktualisiert, und der Rest des Dokuments blieb intakt.

Senden Sie das geänderte Dokument zurück

Standardmäßig wird das Originaldokument zurückgegeben, wenn Sie db.collection.findAndModify() verwenden .

Wenn Sie stattdessen lieber das geänderte Dokument zurückgeben möchten, verwenden Sie den new Parameter.

Standardmäßig ist dies new: false , was zur Rückgabe des Originaldokuments führt. Aber die Angabe von new: true führt dazu, dass stattdessen das geänderte Dokument zurückgegeben wird.

Lassen Sie uns eine weitere Änderung vornehmen, aber dieses Mal verwenden wir new: true .

db.pets.findAndModify({
    query: { name: "Meow" },
    update: { $set: { name: "Scratch" } },
    new: true
})

Ergebnis:

{ "_id" : 3, "name" : "Scratch", "type" : "Cat" }

Also haben wir Meow umbenannt zum Scratch und die Ausgabe spiegelt unsere Änderungen wider.

Upserts

Sie können Upserts ausführen, indem Sie upsert: true angeben .

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

Beispiel mit upsert: false

Hier ist ein Beispiel für den Versuch, ein nicht vorhandenes Dokument zu aktualisieren, wenn upsert: false .

db.pets.findAndModify({
    query: { _id: 4 },
    update: { _id: 4, name: "Fetch", type: "Dog" },
    new: true
})

Ergebnis:

null

Das Dokument existierte nicht in der Sammlung und daher findAndModify() 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.findAndModify({
    query: { _id: 4 },
    update: { _id: 4, name: "Fetch", type: "Dog" },
    new: true,
    upsert: true
})

Ergebnis:

{ "_id" : 4, "name" : "Fetch", "type" : "Dog" }

Dieses Mal wird ein neues Dokument eingefügt und wir sehen das eingefügte Dokument als Ausgabe (weil wir new: true angegeben haben ).

Sehen wir uns die Sammlung noch einmal an.

db.pets.find()

Ergebnis:

{ "_id" : 1, "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Horse" }
{ "_id" : 3, "name" : "Scratch", "type" : "Cat" }
{ "_id" : 4, "name" : "Fetch", "type" : "Dog" }

Wir können also sehen, dass das neue Dokument tatsächlich eingefügt wurde.

Der 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.findAndModify({
   query: { scores: { $gte: 10 } },
   update: { $set: { "scores.$[e]" : 10 } },
   arrayFilters: [ { "e": { $gte: 10 } } ]
})

Ergebnis:

{ "_id" : 2, "scores" : [ 8, 17, 18 ] }

Wie erwartet wird dadurch 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.findAndModify() -Methode akzeptiert auch andere Parameter wie writeConcern , collation , bypassDocumentValidation und mehr.

Siehe die MongoDB-Dokumentation für db.collections.findAndModify() für weitere Informationen.