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