In MongoDB, il $addToSet
l'operatore aggiunge un valore a una matrice a meno che il valore non sia già presente nella matrice.
È simile a $push
operatore, tranne che $push
aggiunge il valore anche se il valore è già presente.
Esempio
Supponiamo di avere una collezione chiamata products
con i seguenti documenti:
db.products.find()
Risultato:
{ "_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" ] }
Possiamo usare $addToSet
per aggiungere un valore a uno di quegli array.
Esempio:
db.products.update(
{ _id: 1 },
{ $addToSet: { sizes: "XL" } }
)
Uscita:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Diamo un'altra occhiata alla nostra raccolta per verificare la modifica:
db.products.find()
Risultato:
{ "_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" ] }
Valori duplicati
Se si tenta di inserire un valore già esistente nell'array, non accade nulla. In altre parole, $addToSet
inserisce il valore solo se non esiste già.
Ecco un esempio di tentativo di inserire un valore già esistente.
db.products.update(
{ _id: 1 },
{ $addToSet: { sizes: "XL" } }
)
Uscita:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
Questo messaggio ci dice che c'era un documento corrispondente (cioè il documento con un _id
di 1
), ma non ci sono state modifiche.
Nell'esempio precedente abbiamo visto "nModified" : 1
, ma in questo esempio vediamo "nModified" : 0
. Questo perché il valore non esisteva quando lo abbiamo inserito nell'esempio precedente, ma in questo esempio esiste già.
Possiamo verificarlo guardando di nuovo la collezione:
db.products.find()
Risultato:
{ "_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" ] }
Aggiungi più valori
Puoi usare il $each
modificatore per aggiungere più valori a una matrice.
Esempio:
db.products.update(
{ _id: 2 },
{
$addToSet: {
sizes: {
$each: [ "XXL", "XXXL" ]
}
}
}
)
Uscita:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Ora controlliamo di nuovo la collezione:
db.products.find()
Risultato:
{ "_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" ] }
Possiamo vedere che i due valori sono stati aggiunti all'array nel documento 2 come previsto.
Aggiungi un array all'array
Puoi anche aggiungere un intero array all'array. Quando si esegue questa operazione, l'intero array viene aggiunto come propria matrice separata.
Supponiamo di avere una raccolta come questa:
db.foo.find()
Risultato:
{ "_id" : 1, "bar" : [ 1, 5, 3 ] } { "_id" : 2, "bar" : [ 8, 17, 18 ] } { "_id" : 3, "bar" : [ 15, 11, 8 ] }
Possiamo aggiungere un array a un array come questo:
db.foo.update(
{ _id: 1 },
{ $addToSet: { bar: [ 7, 8, 9] } }
)
Uscita:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Controlla la collezione:
db.foo.find()
Risultato:
{ "_id" : 1, "bar" : [ 1, 5, 3, [ 7, 8, 9 ] ] } { "_id" : 2, "bar" : [ 8, 17, 18 ] } { "_id" : 3, "bar" : [ 15, 11, 8 ] }