sql >> Databáze >  >> NoSQL >> MongoDB

4 způsoby aktualizace dokumentu v MongoDB

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

  1. Hledání klíčů bez expirace v Redis

  2. Jak deserializovat objekt BsonDocument zpět do třídy

  3. Jarní data Provoz Redis HGETALL

  4. Získejte BinData UUID z Mongo jako řetězec