Capitolo 2

La Ricerca e i Sotto-Documenti


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

La Ricerca e i Sotto-Documenti

Come comportarsi quando vogliamo ricercare all'interno di un sottodocumento? In questa lezione

Ricerca su sottodocumenti

Nelle precedenti lezioni abbiamo visto come effettuare query con gli array, le stringhe e i numeri, quindi per esclusione ci rimangono solo i sottodocumenti, vediamo come usarli.


Innanzitutto creiamo una collection di contatti apposita per i nostri test, dove salviamo qualche contatto socials tipo nick  ed email di twitter.


Bene, se ora volessimo interagire con il sottodocumento che contiene twitter (ossia il nick) ed email come facciamo?

Andiamo per grandi, proviamo a fare la cosa più banale che ci viene in mente, io personalmente scriverei questo:


> db.contacts.find( { socials: { twitter : "yourAlbertoOlla",email : "info@mongodbitalia.it" } } )


Cerchiamo l’attributo socials e riscriviamo esattamente il sottodocumento preciso identico, proviamo a cercare.

Funziona! Ottimo, ma il fatto di averlo dovuto riscrivere precisamente identico fa venire qualche dubbio… proviamo ad invertire l’ordine di twitter ed email senza usare nessun operatore.

In effetti non trova nulla, questo perchè effettua un confronto byte per byte con il BSON del documento ed essendo un ordine diverso anche i byte sono diversi pertanto non trova nulla.


Possiamo provare a scrivere:

> db.contacts.find( { socials: { twitter : "yourAlbertoOlla" } } )

Però anche questo non va bene, perchè in realtà cerca tutti i documenti il cui attributo socials è un sottodocumento che contiene twitter"yourAlbertoOlla", nulla di più e nulla di meno.


Ma allora come facciamo ad accedere agli attributi di un sottodocumento?

Beh, Mongo ci mette a disposizione una sintassi speciale ed è il punto .

In effetti ripensandoci potevo anche arrivarci da solo, d’altronde stiamo parlando di documenti chiamati anche oggetti quindi non è strano dover usare il punto.

Vediamo come usarlo.

> db.contacts.find( { socials.twitter : "yourAlbertoOlla"  } )


Scrivendo questo Mongo cercherà in tutti i documenti l’attributo socials, vedrà se è un sottodocumento e se contiene l’attributo twitter, solo in caso positivo farà un controllo tra le stringhe.


Come sempre possiamo anche combinarlo con altre condizioni.