MongoDB poskytuje různé způsoby aktualizace dokumentu. Metoda, kterou použijete, bude záviset na tom, jak přesně chcete aktualizaci provést.
Tento článek představuje 4 způsoby aktualizace dokumentu v MongoDB.
db.collection.updateOne()
Metoda
db.collection.updateOne()
metoda dělá přesně to, co její název slibuje – aktualizuje jeden dokument.
Předpokládejme, že máme sbírku nazvanou pets
který obsahuje následující dokumenty:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Jeden dokument bychom mohli aktualizovat takto:
db.pets.updateOne(
{ type: "Dog" },
{ $set: { type: "Cow" } }
)
Výsledek:
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
To aktualizovalo pouze jeden dokument, přestože dva dokumenty splňují kritéria filtru (kritéria jsou type: "Dog"
).
Výsledky můžeme zkontrolovat takto:
db.pets.find()
Výsledek:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
První dokument má nyní type
z Cow
místo Dog
, ale druhý dokument nebyl ovlivněn, i když také odpovídal kritériím filtrování.
Položka db.collection.updateMany()
Metoda
db.collection.updateMany()
metoda aktualizuje všechny dokumenty, které odpovídají zadanému filtru pro kolekci.
Použijme původní sbírkové dokumenty:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Opět můžeme vidět, že dva dokumenty mají Dog
jako jejich type
.
Oba dokumenty můžeme aktualizovat najednou takto:
db.pets.updateMany(
{ type: "Dog" },
{ $set: { type: "Cow" } }
)
Výsledek:
{ "acknowledged" : true, "matchedCount" : 2, "modifiedCount" : 2 }
To nám ukazuje, že dva dokumenty se shodovaly a dva byly aktualizovány.
Můžeme zkontrolovat sbírku:
db.pets.find()
Výsledek:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Cow" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }
db.collection.update()
Metoda
db.collection.update()
metoda může aktualizovat jeden dokument nebo více dokumentů v kolekci.
Ve výchozím nastavení aktualizuje pouze jeden dokument. Ale pokud multi: true
je zadáno, pak aktualizuje všechny dokumenty, které odpovídají kritériím dotazu.
Aktualizovat jeden dokument
Použijme znovu původní sbírku dokumentů:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Jeden dokument bychom mohli aktualizovat takto:
db.pets.update(
{ type: "Dog" },
{ $set: { type: "Cow" } }
)
Výsledek:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Aktualizován byl pouze jeden dokument. To se potvrdí, když se na kolekci dotazujeme.
db.pets.find()
Výsledek:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Aktualizovat více dokumentů
Vraťme se znovu k původní sbírce dokumentů:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
A nyní přidáme multi: true
k naší aktualizační operaci k aktualizaci všech dokumentů, které odpovídají kritériím dotazu:
db.pets.update(
{ type: "Dog" },
{ $set: { type: "Cow" } },
{ multi: true }
)
Výsledek:
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })
Takže tentokrát byly spárovány a aktualizovány dva dokumenty.
Podívejme se znovu na naši sbírku:
db.pets.find()
Výsledek:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Cow" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Podle očekávání mají nyní oba dokumenty type
z Cow
.
db.collection.replaceOne()
Metoda
db.collection.replaceOne()
metoda nahradí jeden dokument v rámci kolekce na základě filtru.
Opět s použitím původní kolekce:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Podívejme se, co se stane, když použijeme db.collection.replaceOne()
metoda proti tomu.
db.pets.replaceOne(
{ type: "Dog" },
{ type: "Cow" }
)
Výsledek:
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
Jeden dokument byl aktualizován.
Pojďme se na to podívat.
db.pets.find()
Výsledek:
{ "_id" : 1, "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
Tentokrát byl celý dokument nahrazen novým dokumentem (kromě _id
pole).
Tato metoda nahradí celý dokument (kromě _id
pole).
Upsert
Všechny výše uvedené metody přijímají upsert
argument, který vám umožní provést operaci upsert.
Když upsert: true
, dokument se aktualizuje, pokud existuje shoda s kritérii dotazu, ale pokud žádná shoda není, vloží se nový dokument.
Příklad:
db.pets.updateOne(
{ name: "Wag" },
{ $set: { type: "Cow" } },
{ upsert: true }
)
Výsledek:
{ "acknowledged" : true, "matchedCount" : 0, "modifiedCount" : 0, "upsertedId" : ObjectId("5fe1d5aad991410169410165") }
V tomto případě nebyly nalezeny žádné shody, takže dokument byl přepsán.
Podívejme se na sbírku.
db.pets.find()
Výsledek:
{ "_id" : 1, "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" } { "_id" : ObjectId("5fe1d5aad991410169410165"), "name" : "Wag", "type" : "Cow" }