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

MongoDB findOneAndReplace()

In MongoDB die db.collection.findOneAndReplace() Methode ersetzt ein einzelnes Dokument basierend auf dem angegebenen Filter.

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.findOneAndReplace() verwenden Methode, um eines dieser Dokumente zu ersetzen.

db.pets.findOneAndReplace(
   { "type": "Dog" },
   { "name": "Bruno", "type" : "Horse" }
)

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" : "Bruno", "type" : "Horse" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }

Wir können sehen, dass das erste Dokument durch das neue Dokument ersetzt wurde.

Beachten Sie, dass das Ersetzungsdokument keine _id angeben kann Wert, der sich von der _id unterscheidet Wert im ersetzten Dokument.

Senden Sie das geänderte Dokument zurück

Standardmäßig wird das Originaldokument zurückgegeben, wenn Sie db.collection.findOneAndReplace() 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.findOneAndReplace(
   { "type": "Dog" },
   { "handle": "Harry", "DOB" : "2020-05-12", "points": 10 },
   { returnNewDocument: true }
)

Ergebnis:

{ "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 }

Diesmal wurde der andere Hund aktualisiert. In diesem Fall haben wir eine bedeutendere Änderung vorgenommen, und wir können sehen, dass das Rückgabedokument dies widerspiegelt.

Wir können die Sammlung erneut überprüfen, um das ersetzte Dokument zu sehen.

db.pets.find()

Ergebnis:

{ "_id" : 1, "name" : "Bruno", "type" : "Horse" }
{ "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }

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.findOneAndReplace(
   { "_id": 4 },
   { "name": "Fluffy", "type": "Pooch", "DOB" : "2019-12-03", "points": 20 },
   {
       returnNewDocument: true
    }
)

Ergebnis:

null

Das Dokument existierte nicht in der Sammlung und daher findOneAndReplace() gab null zurück . Auch wenn wir upsert: false nicht explizit 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, "name" : "Bruno", "type" : "Horse" }
{ "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }

Beispiel mit upsert: true

Hier ist es wieder, aber diesmal geben wir upsert: true an .

db.pets.findOneAndReplace(
   { "_id": 4 },
   { "name": "Fluffy", "type": "Pooch", "DOB" : "2019-12-03", "points": 20 },
   {
       upsert: true,
       returnNewDocument: true
    }
)

Ergebnis:

{
	"_id" : 4,
	"name" : "Fluffy",
	"type" : "Pooch",
	"DOB" : "2019-12-03",
	"points" : 20
}

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" : "Bruno", "type" : "Horse" }
{ "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }
{ "_id" : 4, "name" : "Fluffy", "type" : "Pooch", "DOB" : "2019-12-03", "points" : 20 }

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

Die sort Parameter

Sie können die sort verwenden -Parameter, um eine Sortierreihenfolge für die Dokumente anzugeben, die mit dem filter übereinstimmen .

Bei Verwendung der sort Parameter, ein Wert von 1 sortiert die Dokumente in aufsteigender Reihenfolge und einen Wert von -1 sortiert sie in absteigender Reihenfolge.

Das Argument muss als Dokument vorgelegt werden. Beispiel:{ sort: { "salary": 1 } } sortiert nach salary Feld in aufsteigender Reihenfolge.

Angenommen, wir erstellen eine Sammlung mit dem Namen employees mit folgenden Dokumenten:

db.employees.insertMany([
    { _id: 1, name: "Sandy", salary: 55000 },
    { _id: 2, name: "Sarah", salary: 128000 },
    { _id: 3, name: "Fritz", salary: 25000 },
    { _id: 4, name: "Chris", salary: 45000 },
    { _id: 5, name: "Beck", salary: 82000 }
    ])

Wir könnten den folgenden Code ausführen, um Dokumente mit einem Gehalt von weniger als 60000 zu finden, und dann das niedrigste dieser Dokumente ersetzen.

db.employees.findOneAndReplace(
   { "salary": { $lt: 60000 } },
   { "name": "Fluffy", "salary": 250000 },
   {
       sort: { "salary": 1 }
    }
)

Ergebnis:

{ "_id" : 3, "name" : "Fritz", "salary" : 25000 }

Dies zeigt das Dokument, bevor es aktualisiert wurde. Wie erwartet wurde der Mitarbeiter mit dem niedrigsten Gehalt durch ein neues Gehalt (und einen neuen Namen) ersetzt.

So sehen die Dokumente jetzt aus.

db.employees.find()

Ergebnis:

{ "_id" : 1, "name" : "Sandy", "salary" : 55000 }
{ "_id" : 2, "name" : "Sarah", "salary" : 128000 }
{ "_id" : 3, "name" : "Fluffy", "salary" : 250000 }
{ "_id" : 4, "name" : "Chris", "salary" : 45000 }
{ "_id" : 5, "name" : "Beck", "salary" : 82000 }

Wir können also sehen, dass Fritz durch Fluffy ersetzt wurde, der ein viel besseres Gehalt hat.

Stellen wir es wieder auf das Originaldokument zurück.

db.employees.remove({})
db.employees.insertMany([
    { _id: 1, name: "Sandy", salary: 55000 },
    { _id: 2, name: "Sarah", salary: 128000 },
    { _id: 3, name: "Fritz", salary: 25000 },
    { _id: 4, name: "Chris", salary: 45000 },
    { _id: 5, name: "Beck", salary: 82000 }
    ])

Lassen Sie uns nun dasselbe findOneAndReplace() ausführen code erneut, aber diesmal sortieren wir ihn in absteigender Reihenfolge.

db.employees.findOneAndReplace(
   { "salary": { $lt: 60000 } },
   { "name": "Fluffy", "salary": 250000 },
   {
       sort: { "salary": -1 }
    }
)

Ergebnis:

{ "_id" : 1, "name" : "Sandy", "salary" : 55000 }

Diesmal wurde Sandy ersetzt.

Sehen wir uns die Sammlung noch einmal an.

db.employees.find()

Ergebnis:

{ "_id" : 1, "name" : "Fluffy", "salary" : 250000 }
{ "_id" : 2, "name" : "Sarah", "salary" : 128000 }
{ "_id" : 3, "name" : "Fritz", "salary" : 25000 }
{ "_id" : 4, "name" : "Chris", "salary" : 45000 }
{ "_id" : 5, "name" : "Beck", "salary" : 82000 }

Wie erwartet.

Weitere Informationen

Die db.collection.findOneAndReplace() -Methode akzeptiert auch andere Parameter wie projection (um eine Teilmenge der zurückzugebenden Felder anzugeben), maxTimeMS , und sort .

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