MongoDB $setOnInsert
field update operator kan bruges til at indsætte en specifik værdi under en upsert.
Hvis en opdateringshandling resulterer i, at et nyt dokument indsættes (dvs. en upsert), så er $setOnInsert
operatøren træder i kraft, ellers har den ingen effekt.
Eksempel
Antag, at vi har en samling kaldet dogs
med følgende dokument:
{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 }
Og vi kører følgende update()
kommando for at opdatere et dokument, der ikke findes i samlingen:
db.dogs.update(
{ _id: 2 },
{
$set: { weight: 50, height: 40 },
$setOnInsert: { name: "Bark" }
},
{ upsert: true }
)
Dette vil resultere i følgende output:
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 2 })
Hvilket fortæller os, at et dokument blev slettet.
Lad os tjekke samlingen:
db.dogs.find()
Resultat:
{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 } { "_id" : 2, "height" : 40, "name" : "Bark", "weight" : 50 }
Vi kan se, at dokument 2 er blevet indsat, og det inkluderer feltet/værdien, som vi har angivet for $setOnInsert
operatør (dvs. name: "Bark"
).
Når dokumentet findes (dvs. ingen upsert)
Lad os nu prøve at opdatere det dokument, vi lige har overført. Lad os bruge det samme udsagn som i det foregående eksempel, men med forskellige værdier.
db.dogs.update(
{ _id: 2 },
{
$set: { weight: 55, height: 45 },
$setOnInsert: { name: "Fluffy" }
},
{ upsert: true }
)
Output:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Denne gang matchede et dokument og blev opdateret. Intet blev forstyrret.
Lad os tjekke samlingen igen.
db.dogs.find()
Resultat:
{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 } { "_id" : 2, "height" : 45, "name" : "Bark", "weight" : 55 }
Så i dette tilfælde er weight
og height
felter blev opdateret, men name
felt var det ikke.
Årsagen til, at navnefeltet ikke blev opdateret, er, at en upsert ikke blev udført. $setOnInsert
operator specificerer kun feltet/værdien, der skal indstilles, når opdateringshandlingen resulterer i, at et nyt dokument indsættes (dvs. en upsert).