Le MongoDB $setOnInsert
L'opérateur de mise à jour de champ peut être utilisé pour insérer une valeur spécifique lors d'une upsert.
Si une opération de mise à jour entraîne l'insertion d'un nouveau document (c'est-à-dire une mise à jour), alors le $setOnInsert
l'opérateur prend effet, sinon il n'a aucun effet.
Exemple
Supposons que nous ayons une collection appelée dogs
avec le document suivant :
{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 }
Et nous exécutons le update()
suivant commande pour mettre à jour un document qui n'existe pas dans la collection :
db.dogs.update(
{ _id: 2 },
{
$set: { weight: 50, height: 40 },
$setOnInsert: { name: "Bark" }
},
{ upsert: true }
)
Cela se traduira par la sortie suivante :
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 2 })
Ce qui nous indique qu'un document a été mis à jour.
Vérifions la collection :
db.dogs.find()
Résultat :
{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 } { "_id" : 2, "height" : 40, "name" : "Bark", "weight" : 50 }
Nous pouvons voir que le document 2 a été inséré, et il inclut le champ/valeur que nous avons fourni pour le $setOnInsert
opérateur (c'est-à-dire name: "Bark"
).
Lorsque le document existe (c'est-à-dire pas d'upsert)
Essayons maintenant de mettre à jour le document que nous venons de mettre à jour. Utilisons la même instruction que dans l'exemple précédent, mais avec des valeurs différentes.
db.dogs.update(
{ _id: 2 },
{
$set: { weight: 55, height: 45 },
$setOnInsert: { name: "Fluffy" }
},
{ upsert: true }
)
Sortie :
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Cette fois, un document correspondait et a été mis à jour. Rien n'a été bouleversé.
Vérifions à nouveau la collection.
db.dogs.find()
Résultat :
{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 } { "_id" : 2, "height" : 45, "name" : "Bark", "weight" : 55 }
Donc dans ce cas, le weight
et height
les champs ont été mis à jour, mais le name
champ ne l'était pas.
La raison pour laquelle le champ de nom n'a pas été mis à jour est qu'aucun upsert n'a été effectué. Le $setOnInsert
L'opérateur spécifie uniquement le champ/la valeur à définir lorsque l'opération de mise à jour entraîne l'insertion d'un nouveau document (c'est-à-dire une mise à jour).