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" }