I MongoDB är db.collection.findOneAndReplace()
metod ersätter ett enda dokument baserat på det angivna filtret.
collection
del är namnet på samlingen med vilken operationen ska utföras.
Exempel
Anta att vi har en samling som heter pets
som innehåller följande dokument:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Vi kan använda db.collection.findOneAndReplace()
metod för att ersätta ett av dessa dokument.
db.pets.findOneAndReplace(
{ "type": "Dog" },
{ "name": "Bruno", "type" : "Horse" }
)
Resultat:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" }
Som standard returnerar den originaldokumentet (inte den modifierade versionen).
Observera att endast en hund uppdaterades, även om det finns två hundar i samlingen.
Låt oss kolla in 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 att det första dokumentet har ersatts med det nya dokumentet.
Observera att ersättningsdokumentet inte kan ange ett _id
värde som skiljer sig från _id
värdet i det ersatta dokumentet.
Returnera det ändrade dokumentet
Som standard returneras originaldokumentet när du använder db.collection.findOneAndReplace()
.
Om du föredrar att få det ändrade dokumentet returnerat istället, använd returnNewDocument
parameter.
Låt oss göra en annan ändring, men den här gången använder 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 }
Den här gången uppdaterades den andra hunden. I det här fallet gjorde vi en mer betydande förändring och vi kan se att returdokumentet återspeglar detta.
Vi kan kontrollera samlingen igen för att se det ersatta dokumentet.
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" }
Uppserts
En upsert är ett alternativ som du kan använda vid uppdateringsoperationer. Om det angivna dokumentet inte finns infogas ett nytt. Om den gör det existerar, då uppdateras originaldokumentet (och inget dokument infogas).
Du kan utföra upserts genom att ange upsert: true
.
Exempel med upsert: false
Först, här är ett exempel på att försöka uppdatera ett icke-existerande 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 fanns inte i samlingen och därför findOneAndReplace()
returnerade null
. Även om vi inte uttryckligen angav upsert: false
, vi vet att det var falskt eftersom det är standardvärdet (dvs det är det värde som används när du inte anger ett upphävandealternativ).
Om vi tittar igen i samlingen kan vi se att dokumentet inte har rubbats.
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" }
Exempel med upsert: true
Nu är den här igen, men den här gången anger 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 }
Den här gången läggs ett nytt dokument upp och vi ser det upphävda dokumentet som utdata (eftersom vi angav returnNewDocument: true
).
Låt oss kolla in 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 att det nya dokumentet faktiskt var upphävt.
sort
Parameter
Du kan använda sort
parameter för att ange en sorteringsordning för dokumenten som matchas av filter
.
När du använder sort
parameter, ett värde på 1
sorterar dokumenten i stigande ordning och värdet -1
sorterar dem i fallande ordning.
Argumentet måste tillhandahållas som ett dokument. Till exempel, { sort: { "salary": 1 } }
sorterar efter salary
fältet i stigande ordning.
Anta till exempel att vi skapar en samling som heter employees
med följande dokument:
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 kan köra följande kod för att hitta dokument med en lön på mindre än 60 000, och sedan ersätta den som är lägst av dessa dokument.
db.employees.findOneAndReplace(
{ "salary": { $lt: 60000 } },
{ "name": "Fluffy", "salary": 250000 },
{
sort: { "salary": 1 }
}
)
Resultat:
{ "_id" : 3, "name" : "Fritz", "salary" : 25000 }
Detta visar dokumentet innan det uppdaterades. Som väntat ersattes den anställde med lägst lön med en ny lön (och ett nytt namn).
Så här ser dokumenten ut 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 att Fritz har ersatts av Fluffy som har en mycket bättre lön.
Låt oss återställa det till originaldokumentet.
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 }
])
Låt oss nu köra samma findOneAndReplace()
kod igen, men den här gången sorterar vi den i fallande ordning.
db.employees.findOneAndReplace(
{ "salary": { $lt: 60000 } },
{ "name": "Fluffy", "salary": 250000 },
{
sort: { "salary": -1 }
}
)
Resultat:
{ "_id" : 1, "name" : "Sandy", "salary" : 55000 }
Den här gången byttes Sandy ut.
Låt oss kolla in 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 förväntat.
Mer information
db.collection.findOneAndReplace()
Metoden accepterar även andra parametrar, såsom projection
(för att ange en delmängd av fält att returnera), maxTimeMS
och collation
.
Se MongoDB-dokumentationen för db.collections.findOneAndReplace()
för mer information.