MongoDB tillhandahåller olika sätt att uppdatera ett dokument. Metoden du använder beror på exakt hur du vill utföra uppdateringen.
Den här artikeln presenterar fyra sätt att uppdatera ett dokument i MongoDB.
db.collection.updateOne()
Metod
db.collection.updateOne()
metoden gör precis som namnet lovar – den uppdaterar ett dokument.
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 skulle kunna uppdatera ett dokument så här:
db.pets.updateOne(
{ type: "Dog" },
{ $set: { type: "Cow" } }
)
Resultat:
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
Det uppdaterade bara ett dokument, även om två dokument matchar filterkriterierna (kriteriet är type: "Dog"
).
Vi kan kontrollera resultaten så här:
db.pets.find()
Resultat:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Det första dokumentet har nu en type
av Cow
istället för Dog
, men det andra dokumentet påverkades inte, även om det också matchade filtreringskriterierna.
Den db.collection.updateMany()
Metod
db.collection.updateMany()
metod uppdaterar alla dokument som matchar det angivna filtret för en samling.
Låt oss använda de ursprungliga insamlingsdokumenten:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Återigen kan vi se att två dokument har Dog
som deras type
.
Vi kan uppdatera båda dokumenten samtidigt så här:
db.pets.updateMany(
{ type: "Dog" },
{ $set: { type: "Cow" } }
)
Resultat:
{ "acknowledged" : true, "matchedCount" : 2, "modifiedCount" : 2 }
Detta visar oss att två dokument matchade och två uppdaterades.
Vi kan kontrollera samlingen:
db.pets.find()
Resultat:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Cow" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }
db.collection.update()
Metod
db.collection.update()
metod kan uppdatera ett enda dokument eller flera dokument i en samling.
Som standard uppdaterar den bara ett enda dokument. Men om multi: true
anges, uppdaterar den alla dokument som matchar frågekriterierna.
Uppdatera ett enda dokument
Låt oss använda originalsamlingen av dokument igen:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Vi skulle kunna uppdatera ett dokument så här:
db.pets.update(
{ type: "Dog" },
{ $set: { type: "Cow" } }
)
Resultat:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Endast ett dokument uppdaterades. Detta bekräftas när vi frågar samlingen.
db.pets.find()
Resultat:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Uppdatera flera dokument
Låt oss gå tillbaka till den ursprungliga samlingen av dokument igen:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Och nu lägger vi till multi: true
till vår uppdateringsoperation för att uppdatera alla dokument som matchar frågekriterierna:
db.pets.update(
{ type: "Dog" },
{ $set: { type: "Cow" } },
{ multi: true }
)
Resultat:
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })
Så två dokument matchades och uppdaterades denna gång.
Låt oss titta på vår samling igen:
db.pets.find()
Resultat:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Cow" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Som förväntat har båda dokumenten nu en type
av Cow
.
db.collection.replaceOne()
Metod
db.collection.replaceOne()
metod ersätter ett enda dokument inom samlingen baserat på filtret.
Återigen med den ursprungliga samlingen:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Låt oss se vad som händer när vi använder db.collection.replaceOne()
metod mot det.
db.pets.replaceOne(
{ type: "Dog" },
{ type: "Cow" }
)
Resultat:
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
Ett dokument har uppdaterats.
Låt oss ta en titt.
db.pets.find()
Resultat:
{ "_id" : 1, "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Den här gången ersattes hela dokumentet med det nya dokumentet (förutom _id
fält).
Denna metod ersätter hela dokumentet (förutom _id
). fält).
Upsert
Alla ovanstående metoder accepterar en upsert
argument som gör att du kan utföra en upsert-operation.
När upsert: true
, dokumentet uppdateras om det finns en matchning med frågekriterierna, men om det inte finns någon matchning infogas ett nytt dokument.
Exempel:
db.pets.updateOne(
{ name: "Wag" },
{ $set: { type: "Cow" } },
{ upsert: true }
)
Resultat:
{ "acknowledged" : true, "matchedCount" : 0, "modifiedCount" : 0, "upsertedId" : ObjectId("5fe1d5aad991410169410165") }
I det här fallet fanns det inga matchningar, så ett dokument rubbades.
Låt oss kolla in samlingen.
db.pets.find()
Resultat:
{ "_id" : 1, "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" } { "_id" : ObjectId("5fe1d5aad991410169410165"), "name" : "Wag", "type" : "Cow" }