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).