MongoDB udostępnia różne sposoby aktualizowania dokumentu. Metoda, której użyjesz, będzie zależeć od tego, jak chcesz przeprowadzić aktualizację.
W tym artykule przedstawiono 4 sposoby aktualizacji dokumentu w MongoDB.
db.collection.updateOne() Metoda
db.collection.updateOne() metoda robi dokładnie to, co obiecuje jej nazwa – aktualizuje jeden dokument.
Załóżmy, że mamy kolekcję o nazwie pets który zawiera następujące dokumenty:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" } Moglibyśmy zaktualizować jeden dokument w ten sposób:
db.pets.updateOne(
{ type: "Dog" },
{ $set: { type: "Cow" } }
) Wynik:
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
To zaktualizowało tylko jeden dokument, mimo że dwa dokumenty spełniają kryteria filtrowania (kryteria to type: "Dog" ).
Wyniki możemy sprawdzić w następujący sposób:
db.pets.find() Wynik:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }
Pierwszy dokument ma teraz type Cow zamiast Dog , ale nie miało to wpływu na drugi dokument, mimo że również spełniał kryteria filtrowania.
db.collection.updateMany() Metoda
db.collection.updateMany() metoda aktualizuje wszystkie dokumenty, które pasują do określonego filtra dla kolekcji.
Skorzystajmy z oryginalnych dokumentów inkasowych:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }
Po raz kolejny widzimy, że dwa dokumenty mają Dog jako ich type .
Możemy zaktualizować oba dokumenty jednocześnie w ten sposób:
db.pets.updateMany(
{ type: "Dog" },
{ $set: { type: "Cow" } }
) Wynik:
{ "acknowledged" : true, "matchedCount" : 2, "modifiedCount" : 2 } To pokazuje nam, że dwa dokumenty pasowały, a dwa zostały zaktualizowane.
Możemy sprawdzić kolekcję:
db.pets.find() Wynik:
{ "_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 może aktualizować pojedynczy dokument lub wiele dokumentów w kolekcji.
Domyślnie aktualizuje tylko jeden dokument. Ale jeśli multi: true jest określony, a następnie aktualizuje wszystkie dokumenty, które spełniają kryteria zapytania.
Zaktualizuj pojedynczy dokument
Użyjmy ponownie oryginalnej kolekcji dokumentów:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" } Moglibyśmy zaktualizować jeden dokument w ten sposób:
db.pets.update(
{ type: "Dog" },
{ $set: { type: "Cow" } }
) Wynik:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) Zaktualizowano tylko jeden dokument. Potwierdzamy to, gdy wysyłamy zapytanie do kolekcji.
db.pets.find() Wynik:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" } Aktualizuj wiele dokumentów
Wróćmy jeszcze raz do oryginalnej kolekcji dokumentów:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }
A teraz dodamy multi: true do naszej operacji aktualizacji, aby zaktualizować wszystkie dokumenty, które spełniają kryteria zapytania:
db.pets.update(
{ type: "Dog" },
{ $set: { type: "Cow" } },
{ multi: true }
) Wynik:
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 }) Więc tym razem dwa dokumenty zostały dopasowane i zaktualizowane.
Przyjrzyjmy się jeszcze raz naszej kolekcji:
db.pets.find() Wynik:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Cow" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }
Zgodnie z oczekiwaniami oba dokumenty mają teraz type Cow .
db.collection.replaceOne() Metoda
db.collection.replaceOne() metoda zastępuje pojedynczy dokument w kolekcji w oparciu o filtr.
Ponownie używając oryginalnej kolekcji:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }
Zobaczmy, co się stanie, gdy użyjemy db.collection.replaceOne() metoda przeciwko niemu.
db.pets.replaceOne(
{ type: "Dog" },
{ type: "Cow" }
) Wynik:
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 } Zaktualizowano jeden dokument.
Rzućmy okiem.
db.pets.find() Wynik:
{ "_id" : 1, "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }
Tym razem cały dokument został zastąpiony nowym dokumentem (z wyjątkiem _id pole).
Ta metoda zastępuje cały dokument (z wyjątkiem _id pole).
Do góry
Wszystkie powyższe metody akceptują upsert argument, który umożliwia wykonanie operacji upsert.
Kiedy upsert: true , dokument jest aktualizowany, jeśli istnieje zgodność z kryteriami zapytania, ale jeśli nie ma żadnego dopasowania, wstawiany jest nowy dokument.
Przykład:
db.pets.updateOne(
{ name: "Wag" },
{ $set: { type: "Cow" } },
{ upsert: true }
) Wynik:
{
"acknowledged" : true,
"matchedCount" : 0,
"modifiedCount" : 0,
"upsertedId" : ObjectId("5fe1d5aad991410169410165")
} W tym przypadku nie było dopasowań, więc dokument został przesunięty.
Sprawdźmy kolekcję.
db.pets.find() Wynik:
{ "_id" : 1, "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }
{ "_id" : ObjectId("5fe1d5aad991410169410165"), "name" : "Wag", "type" : "Cow" }