I MongoDB er db.collection.findOneAndReplace()
metode erstatter et enkelt dokument baseret på det angivne filter.
collection
del er navnet på den samling, som operationen skal udføres med.
Eksempel
Antag, at vi har en samling kaldet pets
der indeholder følgende dokumenter:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Vi kan bruge db.collection.findOneAndReplace()
metode til at erstatte et af disse dokumenter.
db.pets.findOneAndReplace(
{ "type": "Dog" },
{ "name": "Bruno", "type" : "Horse" }
)
Resultat:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" }
Som standard returnerer den det originale dokument (ikke den ændrede version).
Bemærk, at kun én hund blev opdateret, selvom der er to hunde i samlingen.
Lad os tjekke samlingen.
db.pets.find()
Resultat:
{ "_id" : 1, "name" : "Bruno", "type" : "Horse" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Vi kan se, at det første dokument er blevet erstattet med det nye dokument.
Bemærk, at erstatningsdokumentet ikke kan angive et _id
værdi, der adskiller sig fra _id
værdi i det erstattede dokument.
Returner det ændrede dokument
Som standard returneres det originale dokument, når du bruger db.collection.findOneAndReplace()
.
Hvis du foretrækker at få det ændrede dokument returneret i stedet, skal du bruge returnNewDocument
parameter.
Lad os lave endnu en ændring, men denne gang bruger vi returnNewDocument: true
.
db.pets.findOneAndReplace(
{ "type": "Dog" },
{ "handle": "Harry", "DOB" : "2020-05-12", "points": 10 },
{ returnNewDocument: true }
)
Resultat:
{ "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 }
Denne gang blev den anden hund opdateret. I dette tilfælde lavede vi en mere markant ændring, og vi kan se, at returdokumentet afspejler dette.
Vi kan tjekke samlingen igen for at se det erstattede dokument.
db.pets.find()
Resultat:
{ "_id" : 1, "name" : "Bruno", "type" : "Horse" } { "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Upserts
En upsert er en mulighed, som du kan bruge til opdateringshandlinger. Hvis det angivne dokument ikke eksisterer, indsættes et nyt. Hvis det gør eksisterer, så opdateres det originale dokument (og intet dokument er indsat).
Du kan udføre upserts ved at angive upsert: true
.
Eksempel med upsert: false
Først, her er et eksempel på forsøg på at opdatere et ikke-eksisterende dokument, når upsert: false
.
db.pets.findOneAndReplace(
{ "_id": 4 },
{ "name": "Fluffy", "type": "Pooch", "DOB" : "2019-12-03", "points": 20 },
{
returnNewDocument: true
}
)
Resultat:
null
Dokumentet fandtes ikke i samlingen og derfor findOneAndReplace()
returnerede null
. Selvom vi ikke eksplicit specificerede upsert: false
, vi ved, at det var falsk, fordi det er standardværdien (dvs. det er den værdi, der bruges, når du ikke angiver en upsert-indstilling).
Hvis vi kigger igen i samlingen, kan vi se, at dokumentet ikke blev slettet.
db.pets.find()
Resultat:
{ "_id" : 1, "name" : "Bruno", "type" : "Horse" } { "_id" : 2, "handle" : "Harry", "DOB" : "2020-05-12", "points" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Eksempel med upsert: true
Nu er den her igen, men denne gang angiver vi upsert: true
.
db.pets.findOneAndReplace(
{ "_id": 4 },
{ "name": "Fluffy", "type": "Pooch", "DOB" : "2019-12-03", "points": 20 },
{
upsert: true,
returnNewDocument: true
}
)
Resultat:
{ "_id" : 4, "name" : "Fluffy", "type" : "Pooch", "DOB" : "2019-12-03", "points" : 20 }
Denne gang er et nyt dokument opsat, og vi ser det opsatte dokument som output (fordi vi har specificeret returnNewDocument: true
).
Lad os tjekke samlingen igen.
db.pets.find()
Resultat:
{ "_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 }
Så vi kan se, at det nye dokument faktisk blev ophævet.
sort
Parameter
Du kan bruge sort
parameter for at angive en sorteringsrækkefølge for de dokumenter, der matches af filter
.
Når du bruger sort
parameter, en værdi på 1
sorterer dokumenterne i stigende rækkefølge og en værdi på -1
sorterer dem i faldende rækkefølge.
Argumentet skal leveres som et dokument. For eksempel { sort: { "salary": 1 } }
sorterer efter salary
felt i stigende rækkefølge.
Antag for eksempel, at vi opretter en samling kaldet employees
med følgende dokumenter:
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 }
])
Vi kunne køre følgende kode for at finde dokumenter med en løn på mindre end 60.000, og derefter erstatte den, der er den laveste af disse dokumenter.
db.employees.findOneAndReplace(
{ "salary": { $lt: 60000 } },
{ "name": "Fluffy", "salary": 250000 },
{
sort: { "salary": 1 }
}
)
Resultat:
{ "_id" : 3, "name" : "Fritz", "salary" : 25000 }
Dette viser dokumentet, før det blev opdateret. Medarbejderen med den laveste løn blev som forventet skiftet ud med ny løn (og nyt navn).
Sådan ser dokumenterne ud nu.
db.employees.find()
Resultat:
{ "_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 }
Så vi kan se, at Fritz er blevet erstattet af Fluffy, som har en meget bedre løn.
Lad os vende det tilbage til det originale dokument.
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 }
])
Lad os nu køre den samme findOneAndReplace()
kode igen, men denne gang sorterer vi den i faldende rækkefølge.
db.employees.findOneAndReplace(
{ "salary": { $lt: 60000 } },
{ "name": "Fluffy", "salary": 250000 },
{
sort: { "salary": -1 }
}
)
Resultat:
{ "_id" : 1, "name" : "Sandy", "salary" : 55000 }
Denne gang blev Sandy erstattet.
Lad os tjekke samlingen igen.
db.employees.find()
Resultat:
{ "_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 }
Som forventet.
Flere oplysninger
db.collection.findOneAndReplace()
metode accepterer også andre parametre, såsom projection
(for at angive et undersæt af felter, der skal returneres), maxTimeMS
, og collation
.
Se MongoDB-dokumentationen for db.collections.findOneAndReplace()
for mere information.