MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB $setOnInsert

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