MongoDB giver forskellige måder at opdatere et dokument på. Den metode, du bruger, afhænger af præcis, hvordan du vil udføre opdateringen.
Denne artikel præsenterer 4 måder at opdatere et dokument i MongoDB på.
db.collection.updateOne()
Metode
db.collection.updateOne()
metoden gør præcis, som dens navn lover – den opdaterer ét dokument.
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 kunne opdatere et dokument som dette:
db.pets.updateOne(
{ type: "Dog" },
{ $set: { type: "Cow" } }
)
Resultat:
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
Det opdaterede kun ét dokument, selvom to dokumenter matcher filterkriterierne (kriteriet er type: "Dog"
).
Vi kan tjekke resultaterne sådan her:
db.pets.find()
Resultat:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Det første dokument har nu en type
af Cow
i stedet for Dog
, men det andet dokument var upåvirket, selvom det også matchede filtreringskriterierne.
db.collection.updateMany()
Metode
db.collection.updateMany()
metode opdaterer alle dokumenter, der matcher det angivne filter for en samling.
Lad os bruge de originale indsamlingsdokumenter:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Endnu en gang kan vi se, at to dokumenter har Dog
som deres type
.
Vi kan opdatere begge dokumenter på én gang sådan her:
db.pets.updateMany(
{ type: "Dog" },
{ $set: { type: "Cow" } }
)
Resultat:
{ "acknowledged" : true, "matchedCount" : 2, "modifiedCount" : 2 }
Dette viser os, at to dokumenter matchede, og to blev opdateret.
Vi kan tjekke 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()
Metode
db.collection.update()
metode kan opdatere et enkelt dokument eller flere dokumenter i en samling.
Som standard opdaterer den kun et enkelt dokument. Men hvis multi: true
er angivet, så opdaterer den alle dokumenter, der matcher forespørgselskriterierne.
Opdater et enkelt dokument
Lad os bruge den originale samling af dokumenter igen:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Vi kunne opdatere et dokument som dette:
db.pets.update(
{ type: "Dog" },
{ $set: { type: "Cow" } }
)
Resultat:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Kun ét dokument blev opdateret. Dette bekræftes, når vi forespørger på samlingen.
db.pets.find()
Resultat:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Opdater flere dokumenter
Lad os gå tilbage til den originale samling af dokumenter igen:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Og nu tilføjer vi multi: true
til vores opdateringsoperation for at opdatere alle dokumenter, der matcher forespørgselskriterierne:
db.pets.update(
{ type: "Dog" },
{ $set: { type: "Cow" } },
{ multi: true }
)
Resultat:
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })
Så to dokumenter blev matchet og opdateret denne gang.
Lad os se på vores 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 forventet har begge dokumenter nu en type
af Cow
.
db.collection.replaceOne()
Metode
db.collection.replaceOne()
metode erstatter et enkelt dokument i samlingen baseret på filteret.
Igen ved at bruge den originale samling:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Lad os se, hvad der sker, når vi bruger db.collection.replaceOne()
metode mod det.
db.pets.replaceOne(
{ type: "Dog" },
{ type: "Cow" }
)
Resultat:
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
Et dokument blev opdateret.
Lad os tage et kig.
db.pets.find()
Resultat:
{ "_id" : 1, "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Denne gang blev hele dokumentet erstattet med det nye dokument (undtagen _id
). Mark).
Denne metode erstatter hele dokumentet (undtagen _id
). felt).
Ophæv
Alle ovenstående metoder accepterer en upsert
argument, der sætter dig i stand til at udføre en upsert-operation.
Når upsert: true
, dokumentet opdateres, hvis der er et match med forespørgselskriterierne, men hvis der ikke er noget match, indsættes et nyt dokument.
Eksempel:
db.pets.updateOne(
{ name: "Wag" },
{ $set: { type: "Cow" } },
{ upsert: true }
)
Resultat:
{ "acknowledged" : true, "matchedCount" : 0, "modifiedCount" : 0, "upsertedId" : ObjectId("5fe1d5aad991410169410165") }
I dette tilfælde var der ingen resultater, så et dokument blev slettet.
Lad os tjekke 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" }