De MongoDB $setOnInsert
field update-operator kan worden gebruikt om een specifieke waarde in te voegen tijdens een upsert.
Als een update-bewerking ertoe leidt dat een nieuw document wordt ingevoegd (d.w.z. een upsert), dan is de $setOnInsert
operator wordt van kracht, anders heeft het geen effect.
Voorbeeld
Stel dat we een verzameling hebben met de naam dogs
met het volgende document:
{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 }
En we draaien de volgende update()
commando om een document bij te werken dat niet in de collectie bestaat:
db.dogs.update(
{ _id: 2 },
{
$set: { weight: 50, height: 40 },
$setOnInsert: { name: "Bark" }
},
{ upsert: true }
)
Dit resulteert in de volgende uitvoer:
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 2 })
Wat ons vertelt dat één document is gekraakt.
Laten we de collectie eens bekijken:
db.dogs.find()
Resultaat:
{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 } { "_id" : 2, "height" : 40, "name" : "Bark", "weight" : 50 }
We kunnen zien dat document 2 is ingevoegd en het bevat het veld/de waarde die we hebben opgegeven voor de $setOnInsert
operator (d.w.z. name: "Bark"
).
Wanneer het document bestaat (d.w.z. geen upsert)
Laten we nu proberen het document dat we zojuist hebben bijgewerkt, bij te werken. Laten we dezelfde instructie gebruiken als in het vorige voorbeeld, maar met andere waarden.
db.dogs.update(
{ _id: 2 },
{
$set: { weight: 55, height: 45 },
$setOnInsert: { name: "Fluffy" }
},
{ upsert: true }
)
Uitgang:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Deze keer kwam één document overeen en werd het bijgewerkt. Niets was verstoord.
Laten we de collectie nog eens bekijken.
db.dogs.find()
Resultaat:
{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 } { "_id" : 2, "height" : 45, "name" : "Bark", "weight" : 55 }
Dus in dit geval is het weight
en height
velden zijn bijgewerkt, maar de name
veld niet.
De reden dat het naamveld niet is bijgewerkt, is omdat er geen upsert werd uitgevoerd. De $setOnInsert
operator specificeert alleen het veld/de waarde die moet worden ingesteld wanneer de update-bewerking resulteert in het invoegen van een nieuw document (d.w.z. een upsert).