Capitolo 2

Combinare le Query con $AND e $OR


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

Combinare le Query con $AND e $OR

Impariamo ad usare correttamente gli operatori di $or e $and per combinare più condizioni in un unica query.

Lezione su $or

In questa lezione parleremo degli operatori AND e OR che servono per combinare più condizioni tra loro, per creare query più complesse.

Fino ad ora abbiamo visto gli operatori usati come sottodocumento del nostro attributo, mentre questi due sono gli unici che si utilizzano in maniera diversa, vediamo come, partiamo dall’OR:

>db.users.find( { $or:[ { COND1 }, { COND2 }  ] } )


La prima cosa che dobbiamo specificare nel nostro documento è l’operatore che sarà un array contenente le varie condizioni da combinare. Ad esempio:


>db.users.find( { $or:[ {   name:{ $regex:”a$” }   }, { city:{ $exists:false } }  ] } )


in questo caso ci sono due condizioni separate che vengono unite dalla clausola OR, per ottenere un risultato basta che solamente una delle due sia soddisfatta.


Scrivendo query elaborate potremo avere problemi a districarci con le parentesi, fortunatamente la shell stessa ci viene in aiuto. Infatti, se ci spostiamo con il cursore su un simbolo di gruppo, come la parentesi tonda, quadra o graffa, possiamo vedere che la sua corrispondente viene illuminata di blu.


Se dovessimo dimenticarci di chiuderne qualcuna la shell ci avviserà scrivendo tre punti …

È il suo modo per dirci che il documento non è concluso, per andare avanti ci basterà cliccare invio.


Lezione su $and


Passiamo all’operatore $and, la struttura è del tutto simile a quella dell’$or, vediamo:


>db.users.find( { $and:[ {   name:{ $gt:”C” }   }, { city:{ $exists:false } }  ] } )


Funziona ma equivale semplicemente a scrivere:


>db.users.find( { {   name:{ $gt:”C” } , city:{ $exists:false } } )


Di norma si consiglia l’utilizzo della seconda struttura in quanto risulta più performante dal momento che con l’operatore $and le condizioni vengono valutate separatamente l’una dall’altra.