Capitolo 2

Update: Upsert e Multi-Update


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: Upsert e Multi-Update

Gli ultimi due approcci dell'update su MongoDB: upsert e multiupdate.

Lezione su Upsert

Finalmente dopo tanta fatica siamo arrivati al terzo approccio chiamato upsert, non spaventatevi non è nulla di strano. È da considerarsi un’opzione facoltativa della funzione update, che ci permette di modificare un elemento anche se questo non esiste o meglio prima lo crea in automatico e poi lo salva “modificato”. Basta parlare vediamo come funziona.


Nella nostra collection utenti abbiamo tante persone diverse, Alberto, Marta, Felice, 20 e altri come Carlo, se scriviamo:

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

Abbiamo già visto come Mongo aggiunga senza problemi l’attributo City ma se volessimo aggiungerlo a Mario? Noi sappiamo bene che Mario non c’è nella collection, ma se non lo sapessimo cosa succederebbe? Proviamo insieme:

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

Niente ovviamente… dato che non viene trovato nessun documento con nome Mario!

Ok, allora siamo costretti ad aggiungerlo per poi modificarlo, per non fare due operazioni diverse Mongo ci propone un’opzione facoltativa di update chiamata upsert, da inserire come terzo argomento.


>db.users.update( { name :”Mario” }, { $set: { city:”Venezia” }  }, { upsert:true } )

Come abbiamo visto in altre funzioni per passare delle opzioni ci basterà semplicemente aggiungere un nuovo documento alla fine, con in questo caso upsert: true.

In questo modo stiamo dicendo a Mongo: “se non dovessi trovare nessun documento che corrisponda alla condizione, aggiungilo e applica anche la modifica”.

Quindi il documento aggiunto avrà sia come nome Mario sia come città Venezia.


Ovviamente Mongo ha potuto inserire gli attributi perchè abbiamo specificato un valore concreto, diverso sarebbe stato se come condizione avessimo messo ad esempio un intervallo con $gt e $lt, avrebbe comunque effettuato l’upsert ma senza impostare il nome dato che non sarebbe stato un valore concreto.

Lezione su Multi-update

Ah finalmente il quarto e ultimo approccio dell’update: il multi-update.

Multi-update? Qualcuno rimarrà perplesso, si perchè non so se ve ne siete accorti ma gli update su Mongo vengono applicati ad un solo documento, come se avessero limit 1.

Fateci caso, tutti quelli che abbiamo visto sinora in realtà servivano per modificare uno specifico documento, se avessimo voluto applicare la modifica a più documenti avremmo dovuto aggiungere l’opzione { multi: true }.

Nel caso ci sia una condizione in cui rientrino più documenti lui modificherà il primo che gli capita sottomano fermandosi subito dopo.


Se volessimo applicare l’update a tutti i documenti che rientrassero nella condizione allora dovremo aggiungere l’opzione chiamata multi, quindi multi:true. Proviamo:

>db.users.update( { city:{ $exists:true } }, { $set: { city:”Roma” }  }, { multi:true } )

Perfetto, ha modifiato tutti i documenti che avevano l’attributo città sovrascrivendolo con Roma.


Per applicare una modifica a tutti i documenti ci basterà semplicemente mettere come condizione un documento vuoto, in questo modo:

>db.users.update( { }, { $set: { city:”Roma” }  }, { multi:true } )


In qualche driver vi potrà anche capitare di trovare l’update e il multi-update come due funzioni diverse, in realtà sapete che non è cosi.


Abbiamo finito quest’odissea :) adesso conosciamo tutti i 4 approcci con cui utilizzare il metodo update.