Dans MongoDB, le $addToSet
ajoute une valeur à un tableau sauf si la valeur est déjà présente dans le tableau.
C'est similaire au $push
opérateur, sauf que $push
ajoute la valeur même si la valeur est déjà présente.
Exemple
Supposons que nous ayons une collection appelée products
avec les documents suivants :
db.products.find()
Résultat :
{ "_id" : 1, "product" : "Bat", "sizes" : [ "S", "M", "L" ] } { "_id" : 2, "product" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "product" : "Cap", "sizes" : [ "S", "M", "L", "XL" ] }
Nous pouvons utiliser $addToSet
pour ajouter une valeur à l'un de ces tableaux.
Exemple :
db.products.update(
{ _id: 1 },
{ $addToSet: { sizes: "XL" } }
)
Sortie :
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Jetons un autre coup d'œil à notre collection pour vérifier le changement :
db.products.find()
Résultat :
{ "_id" : 1, "product" : "Bat", "sizes" : [ "S", "M", "L", "XL" ] } { "_id" : 2, "product" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "product" : "Cap", "sizes" : [ "S", "M", "L", "XL" ] }
Valeurs en double
Si vous essayez d'insérer une valeur qui existe déjà dans le tableau, rien ne se passe. En d'autres termes, $addToSet
n'insère la valeur que si elle n'existe pas déjà.
Voici un exemple de tentative d'insertion d'une valeur qui existe déjà.
db.products.update(
{ _id: 1 },
{ $addToSet: { sizes: "XL" } }
)
Sortie :
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
Ce message nous indique qu'il y avait un document correspondant (c'est-à-dire le document avec un _id
de 1
), mais il n'y a eu aucune modification.
Dans l'exemple précédent nous avons vu "nModified" : 1
, mais dans cet exemple nous voyons "nModified" : 0
. C'est parce que la valeur n'existait pas lorsque nous l'avons insérée dans l'exemple précédent, mais dans cet exemple, elle existe déjà.
Nous pouvons le vérifier en examinant à nouveau la collection :
db.products.find()
Résultat :
{ "_id" : 1, "product" : "Bat", "sizes" : [ "S", "M", "L", "XL" ] } { "_id" : 2, "product" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "product" : "Cap", "sizes" : [ "S", "M", "L", "XL" ] }
Ajouter plusieurs valeurs
Vous pouvez utiliser le $each
modificateur pour ajouter plusieurs valeurs à un tableau.
Exemple :
db.products.update(
{ _id: 2 },
{
$addToSet: {
sizes: {
$each: [ "XXL", "XXXL" ]
}
}
}
)
Sortie :
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Maintenant, vérifions à nouveau la collection :
db.products.find()
Résultat :
{ "_id" : 1, "product" : "Bat", "sizes" : [ "S", "M", "L", "XL" ] } { "_id" : 2, "product" : "Hat", "sizes" : [ "S", "L", "XL", "XXL", "XXXL" ] } { "_id" : 3, "product" : "Cap", "sizes" : [ "S", "M", "L", "XL" ] }
Nous pouvons voir que les deux valeurs ont été ajoutées au tableau dans le document 2 comme prévu.
Ajouter un tableau au tableau
Vous pouvez également ajouter un tableau entier au tableau. Lorsque vous faites cela, le tableau entier est ajouté comme son propre tableau séparé.
Supposons que nous ayons une collection comme celle-ci :
db.foo.find()
Résultat :
{ "_id" : 1, "bar" : [ 1, 5, 3 ] } { "_id" : 2, "bar" : [ 8, 17, 18 ] } { "_id" : 3, "bar" : [ 15, 11, 8 ] }
Nous pouvons ajouter un tableau à un tableau comme ceci :
db.foo.update(
{ _id: 1 },
{ $addToSet: { bar: [ 7, 8, 9] } }
)
Sortie :
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Vérifiez la collection :
db.foo.find()
Résultat :
{ "_id" : 1, "bar" : [ 1, 5, 3, [ 7, 8, 9 ] ] } { "_id" : 2, "bar" : [ 8, 17, 18 ] } { "_id" : 3, "bar" : [ 15, 11, 8 ] }