MongoDB $setOnInsert
Operátor aktualizace pole lze použít k vložení konkrétní hodnoty během upsert.
Pokud operace aktualizace vede k vložení nového dokumentu (tj. upsert), pak $setOnInsert
operátor vstoupí v platnost, jinak nemá žádný účinek.
Příklad
Předpokládejme, že máme sbírku nazvanou dogs
s následujícím dokumentem:
{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 }
A spustíme následující update()
příkaz k aktualizaci dokumentu, který v kolekci neexistuje:
db.dogs.update(
{ _id: 2 },
{
$set: { weight: 50, height: 40 },
$setOnInsert: { name: "Bark" }
},
{ upsert: true }
)
Výsledkem bude následující výstup:
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 2 })
Což nám říká, že jeden dokument byl narušen.
Podívejme se na sbírku:
db.dogs.find()
Výsledek:
{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 } { "_id" : 2, "height" : 40, "name" : "Bark", "weight" : 50 }
Vidíme, že byl vložen dokument 2 a obsahuje pole/hodnotu, kterou jsme poskytli pro $setOnInsert
operátor (tj. name: "Bark"
).
Když dokument existuje (tj. bez aktualizace)
Nyní se pokusíme aktualizovat dokument, který jsme právě přerušili. Použijme stejný příkaz jako v předchozím příkladu, ale s jinými hodnotami.
db.dogs.update(
{ _id: 2 },
{
$set: { weight: 55, height: 45 },
$setOnInsert: { name: "Fluffy" }
},
{ upsert: true }
)
Výstup:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Tentokrát se jeden dokument shodoval a byl aktualizován. Nic nebylo naštvané.
Podívejme se znovu na sbírku.
db.dogs.find()
Výsledek:
{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 } { "_id" : 2, "height" : 45, "name" : "Bark", "weight" : 55 }
Takže v tomto případě weight
a height
pole byla aktualizována, ale name
pole nebylo.
Důvod, proč nebylo pole názvu aktualizováno, je ten, že se neprováděl upsert. $setOnInsert
Operátor pouze specifikuje pole/hodnotu, která má být nastavena, když operace aktualizace povede k vložení nového dokumentu (tj. upsert).