Capitolo 2

Update: i Primi Due Approcci


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: i Primi Due Approcci

L' upload su MongoDB può essere utilizzato con vari approcci diversi, in questa lezione approfondiremo le prime due.

Primo Approccio: sostituzione completa

Finalmente siamo arrivati alla parte più importante ovvero l’update. Questa funzione su Mongo può essere usata con quattro diversi approcci, che spiegheremo nel dettaglio.

Possiamo fare: una sostituzione completa, un’aggiunta o modifica in un documento (una modifica se esiste, un’aggiunta se non esiste), un upsert e un update multiplo.


Partiamo dal primo approccio ovvero la sostituzione completa. Il metodo update riceve in ingresso 2 argomenti obbligatori e sono una condizione (come quelle usate nella find) e un nuovo documento:

>db.users.update( { name:”Bob” }, { name:”Bob”, city:”Roma” } )


In questo caso Mongo cercherà il primo documento che soddisfa la condizione e lo sostituirà completamente con il documento precisato nell’update, quindi se avessimo 100 attributi e ne volessimo modificare solo uno dovremmo riscriverli tutti.

L’unico attributo che rimane invariato sarà _id che essendo immutabile non può essere sovrascritto.


Diciamo che questa pratica è un po’ pericolosa, perchè se ci dimenticassimo di specificare qualche attributo nel documento durante l’update questi verrebbero persi per sempre.

Può essere utile nella programmazione dove di solito si cerca un elemento nel database, lo si modifica nell’app e poi lo si risalva nel database già modificato, ma così facendo non teniamo conto di modifiche concorrenti quindi a meno che non serva questo specifico approccio consiglio di non usarlo.

Secondo Approccio: operatori $set, $inc e $unset


Abbiamo appurato che il primo approccio della sostituzione completa può essere pericoloso in base al tipo di app. Vediamo allora il secondo approccio, quello della modifica di uno specifico attributo. Ad esempio se volessi modificare solo l’attributo city:

>db.users.update( { name:”Bob” }, { name:”Bob”, city:”Milano” } )


Questa non sarebbe sicuramente la soluzione migliore quindi Mongo ci introduce un nuovo operatore apposito per gli update ovvero $set:

>db.users.update( { name:”Bob” }, { $set: { city:”Milano”}  } )

A differenza degli operatori di find dove bisognava specificare prima l’attributo e poi l’operatore come sottodocumento, nell’update dobbiamo fare il contrario ovvero prima indichiamo l’operatore e poi come sottodocumento gli attributi e i valori.


Questa query cerca un documento con nome Bob e modifica l’attributo city in Milano, se non trova l’attributo indovinate cosa fa...lo crea perchè tutto è pensato per adattarsi, quindi $set serve sia per aggiungere un nuovo attributo sia per modificarlo in caso già esista. Facciamo qualche prova, inseriamo un’età ad Enrico, ad esempio 24.


Se volessimo aggiornarla a 25 potremmo sempre fare un’update con l’operatore $set e sostituire un numero con un altro, è molto efficiente su Mongo ma questo presuppone che dobbiamo già conoscere la sua età prima di modificare il documento.

Ovviamente non è sempre così, infatti Mongo ci propone un altro operatore: $inc, che come suggerisce il nome serve per incrementare o decrementare a step.


Quindi se volessimo incrementare l’età di Enrico di un anno senza conoscere con precisione quanto anni ha ci basterebbe scrivere:

>db.users.update( { name:”Enrico” }, { $inc : { age:1 } } )

Con l’operatore $inc dobbiamo specificare lo step di incremento e dal momento che noi vogliamo incrementare di uno, scriviamo 1.


Come $set anche $inc è molto versatile infatti se provassimo ad usarlo in un documento che non ha l’attributo età come ad esempio Carlo, cosa pensate che accadrebbe?

>db.users.update( { name:”Carlo” }, { $inc : { age:1 } } )

Mongo lo creerebbe mettendo come valore lo step da incrementare...io ve l’avevo detto che è furbo.


Ovviamente la spiegazione di questo secondo approccio non sarebbe completa se non vi facessi vedere anche come eliminare un attributo specifico e quindi fare l’opposto dell’operatore $set che con molta fantasia hanno chiamo $unset:

>db.users.update( { name:”Carlo” }, { $unset: { age:1}  } )


È simile ma si applica in maniera leggermente diversa, quando usiamo $unset non dobbiamo specificare il valore corretto dell’attributo da eliminare… ok pessimo esempio in questo caso sono uguali, ma in realtà l’1 di $unset è da considerarsi come un true, al posto di 1 avremo potuto scrivere true.

Quindi farà questo: cercherà un documento con nome uguale a Carlo, controllerà se esiste un attributo di nome age e a prescindere dal suo valore lo eliminerà, lasciando ovviamente invariati gli altri attributi del documento.


Ahh abbiamo visto tutto quello che serve per l’update… no non è vero manca ancora tutta la divertentissima parte degli array!