MongoDB $setOnInsert field update operator kan användas för att infoga ett specifikt värde under en upsert.
Om en uppdateringsåtgärd resulterar i att ett nytt dokument infogas (d.v.s. en upsert), då $setOnInsert operatören träder i kraft, annars har den ingen effekt.
Exempel
Anta att vi har en samling som heter dogs med följande dokument:
{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 }
Och vi kör följande update() kommando för att uppdatera ett dokument som inte finns i samlingen:
db.dogs.update(
{ _id: 2 },
{
$set: { weight: 50, height: 40 },
$setOnInsert: { name: "Bark" }
},
{ upsert: true }
) Detta kommer att resultera i följande utdata:
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 2 }) Vilket säger oss att ett dokument har rubbats.
Låt oss kolla samlingen:
db.dogs.find() Resultat:
{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 }
{ "_id" : 2, "height" : 40, "name" : "Bark", "weight" : 50 }
Vi kan se att dokument 2 har infogats och det inkluderar fältet/värdet som vi angav för $setOnInsert operatör (dvs. name: "Bark" ).
När dokumentet finns (d.v.s. Inget uppslag)
Låt oss nu försöka uppdatera dokumentet vi nyss upphävde. Låt oss använda samma påstående som i föregående exempel, men med andra värden.
db.dogs.update(
{ _id: 2 },
{
$set: { weight: 55, height: 45 },
$setOnInsert: { name: "Fluffy" }
},
{ upsert: true }
) Utdata:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) Den här gången matchade ett dokument och uppdaterades. Ingenting var upprört.
Låt oss kolla in samlingen igen.
db.dogs.find() Resultat:
{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 }
{ "_id" : 2, "height" : 45, "name" : "Bark", "weight" : 55 }
Så i det här fallet, weight och height fälten uppdaterades, men name fältet var det inte.
Anledningen till att namnfältet inte uppdaterades är att en upsert inte utfördes. $setOnInsert operatorn anger bara fältet/värdet som ska ställas in när uppdateringsåtgärden resulterar i att ett nytt dokument infogas (dvs. en upsert).