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