MongoDB $setOnInsert
Operator aktualizacji pola może być użyty do wstawienia określonej wartości podczas upsert.
Jeśli operacja aktualizacji powoduje wstawienie nowego dokumentu (tj. upsert), to $setOnInsert
operator działa, w przeciwnym razie nie ma żadnego efektu.
Przykład
Załóżmy, że mamy kolekcję o nazwie dogs
z następującym dokumentem:
{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 }
I uruchamiamy następującą update()
polecenie, aby zaktualizować dokument, który nie istnieje w kolekcji:
db.dogs.update(
{ _id: 2 },
{
$set: { weight: 50, height: 40 },
$setOnInsert: { name: "Bark" }
},
{ upsert: true }
)
Spowoduje to następujący wynik:
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 2 })
Co mówi nam, że jeden dokument został przesunięty.
Sprawdźmy kolekcję:
db.dogs.find()
Wynik:
{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 } { "_id" : 2, "height" : 40, "name" : "Bark", "weight" : 50 }
Widzimy, że dokument 2 został wstawiony i zawiera pole/wartość, które podaliśmy dla $setOnInsert
operator (np. name: "Bark"
).
Kiedy dokument istnieje (tj. brak upsert)
Teraz spróbujmy zaktualizować dokument, który właśnie podmieniliśmy. Użyjmy tej samej instrukcji, co w poprzednim przykładzie, ale z różnymi wartościami.
db.dogs.update(
{ _id: 2 },
{
$set: { weight: 55, height: 45 },
$setOnInsert: { name: "Fluffy" }
},
{ upsert: true }
)
Wyjście:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Tym razem jeden dokument pasował i został zaktualizowany. Nic nie zostało zepsute.
Sprawdźmy ponownie kolekcję.
db.dogs.find()
Wynik:
{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 } { "_id" : 2, "height" : 45, "name" : "Bark", "weight" : 55 }
W tym przypadku weight
i height
pola zostały zaktualizowane, ale name
pole nie było.
Powodem, dla którego pole nazwy nie zostało zaktualizowane, jest to, że nie wykonano upsert. $setOnInsert
operator określa tylko pole/wartość do ustawienia, gdy operacja aktualizacji spowoduje wstawienie nowego dokumentu (tj. upsert).