MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB $ aggiungi a set

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 ] }