Capitolo 2

Update e gli Array


Capitolo 2: CRUD


Presentazione CRUD e Operatori
Insert: Aggiungere Documenti
Find e FindOne: Cercare i Documenti
Operatori $GT e $LT: Maggiore di e Minore di
Operatori $EXISTS, $TYPE e $REGEX
Combinare le Query con $AND e $OR
La Ricerca e gli Array
Operatori $ALL, $IN e $NIN
La Ricerca e i Sotto-Documenti
Limit, Sort, Skip e Count
Update: i Primi Due Approcci
Update e gli Array
Update: Upsert e Multi-Update
Remove e Drop: Eliminare i Documenti

Update e gli Array

Approfondimento sull'update e gli array, useremo gli operatori $push, $pull, $pop, $pushAll, $pullAll, $addToSet

Tanti nuovi operatori

Mongo ci offre molti operatori appositi per modificare gli array, cerchiamo di vederli tutti.

Innanzitutto creiamo una collection apposita per l’impresa in cui usiamo valori numerici per rendere più facile la comprensione.

>db.arrays.insert( { _id: 0, a : [ 1, 2, 3, 4 ] } )

L’attributo a è di tipo array e come ben sapete, gli array, hanno un loro indice decimale interno. Ovviamente questo è presente anche su Mongo, quindi possiamo scrivere qualcosa come:

>db.arrays.update( { _id:0 }, { $set: { “a.2”: 5 }  } )

Quindi abbiamo usato il punto come se avessimo voluto accedere ad un attributo di un sottodocumento e gli abbiamo settato un nuovo valore. L’indice interno degli array parte da 0, di conseguenza modificando l’elemento in posizione 2 in realtà modifichiamo il terzo.


Questo era solo il riscaldamento, adesso vediamo gli operatori specifici che ci mette a disposizione per la manipolazione.


Abbiamo $push che serve per inserire un nuovo elemento in coda, quindi estende l’array, tenendo conto dell’ordinamento:

>db.arrays.update( { _id:0 }, { $push: { a: 6 } } )


Se volessimo eliminare un elemento senza conoscere la sua posizione possiamo usare $pull:

>db.arrays.update( { _id:0 }, { $pull: { a: 5 }  } )

In questo caso Mongo cerca il valore specificato in tutte le posizioni dell’array e se lo trova lo elimina. Se invece volessimo eliminare elementi in base alla loro posizione e non al loro valore, ad esempio eliminare i primi o ultimi elementi di un array, potremmo usare $pop:

>db.arrays.update( { _id:0 }, { $pop: { a: 1 }  } )


A $pop dobbiamo passare il numero degli elementi da eliminare, in questo caso eliminerà il primo elemento presente nell’array qualsiasi esso sia, se invece inserissimo un valore negativo partirebbe dalla fine, ad esempio con -1 eliminerebbe l’ultimo elemento.


Abbiamo anche alcune variati come ad esempio $pushAll e $pullAll che ci permettono di fare la stessa cosa dell’operatore classico ma per liste di valori.

$pushAll si occuperà di aggiungere una lista di valori ad un array, in questo modo:

>db.arrays.update( { _id:0 }, { $pushAll: { a: [ 5, 6, 7, 8 ] }  } )

Questo operatore non controlla se ci sono doppioni o simili, aggiunge semplicemente in coda la lista degli elementi passati.


$pullAll invece si occupa di eliminarli, quindi con:

>db.arrays.update( { _id:0 }, { $pullAll: { a: [ 7, 8 ] }  } )

Possiamo eliminare i valori 7 e 8 dall’array a prescindere dalla posizione in cui si trovano.


Abbiamo anche un ultimo operatore particolare che serve per quelle liste dove non vogliamo che nessun valore sia ripetuto, quindi array senza duplicazioni, ed è chiamato $addToSet, aggiungi nel set.

Questo è l’unico operatore che si preoccupa della presenza del valore in un array prima di fare qualcosa.

>db.users.update( { _id:0 }, { $addToSet: { a: 7 }  } )

Infatti, se il valore non è presente nell’array come in questo caso lo aggiunge come se fosse un $push mentre se il valore è già presente non fa assolutamente nulla.


Adesso abbiamo finalmente visto tutti gli operatori che offre Mongo per manipolare gli array e siamo in grado di usare quelli più adatti alle nostre esigenze.