Capitolo 2

Limit, Sort, Skip e Count


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

Limit, Sort, Skip e Count

MongoDB ha alcuni similitudini con l'SQL come il Limiti, il Sort, lo Skip ed il Count, vediamo come utilizzarli ma prima parliamo del Cursore.

L'oggetto Cursore con Limit,Sort e Skip

Abbiamo visto come effettuare inserimenti, interrogazioni e ricerche di diverso tipo ma vorrei soffermarmi un attimo per spiegarvi cosa succede dietro le quinte quando noi lanciamo una query, parliamo quindi del cursore.

Quando noi lanciamo il comando find:

> db.contacts.find()

viene costruito un oggetto di tipo cursore che contatta il database ed immagazzina la risposta, immaginiamocela come una lista di documenti, la shell è impostata per iterare il coursore e quindi mostrare tutti gli elementi.


Volendo possiamo scorrere il cursore manualmente, scrivendo:

> var cur = db.contacts.find(); null;

dobbiamo aggiungere null alla fine della riga perchè altrimenti la shell lancerebbe la query e ci rovinerebbe i piani.

La variabile cur è un oggetto di tipo cursore che ovviamente ha i suoi metodi, comunemente abbiamo hasNext e next. HasNext verifica se è presente l’elemento successivo alla posizione del cursore e nel caso restituisce true, altrimenti false, in questo modo:

> cur.hasNext()


La next funziona in modo analogo ma restituisce l’elemento successivo spostando il cursore.


Questi due metodi sono molto utili nella programmazione per creare soluzioni personalizzate.

Possiamo anche scrivere un ciclo per scorrere completamente il nostro cursore, ottenendo lo stesso risultato della shell:

> while( cur.hasNext() ) printjson( cur.next() );


Vediamo qualche altra funzionalità del cursore, ridichiariamo la variabile cur:

> var cur = db.contacts.find(); null;


Possiamo utilizzare il metodo limit per limitare i risultati del cursore, un po’ come nelle select dell’ SQL:

> cur.limit(5); null;

Se rieseguiamo il ciclo possiamo vedere come i risultati siano limitati a 5.

Con quest’azione abbiamo modificato il cursore anche se in realtà non è stato inviato ancora nessun dato al server, quindi l’oggetto cursore per il momento è solo nella nostra shell.


Non c’è solo limit ma anche skip e sort. Ripristiniamo la variabile cur e proviamo:

> var cur = db.contacts.find(); null;


Il sort è come l’order by delle select in SQL.

> cur.sort( { name: -1 } ); null;

Il sort ha bisogno di un sottodocumento dove inseriamo l’attributo con il quale vogliamo ordinare i risultati e il tipo di ordinamento, 1 è inteso come crescente mentre -1 come decrescente, ovviamente possiamo aggiungere anche altri attributi di ordinamento in ordine di priorità.


Skip invece è simile alla limit e permette di saltare N risultati.

> cur.skip( 2 ); null;

In questo modo i primi due documenti dei nostri risultati verranno saltati e non ci verranno restituiti.


Visto che sono tutti metodi del cursore possiamo anche combinarli assieme e scriverli in un unica riga ad esempio:

> cur.sort( { name: -1 } ).skip( 2 ).limit(5); null;


Una cosa importante da sapere riguarda l’ordine: Mongo non considera l’ordine con il quale noi li dichiariamo ma, quando deve applicarli, usa un suo ordine molto rigoroso che è:

sort, limit e skip. Quindi noi possiamo dichiararli in qualsiasi posizione dal momento che il cursore esiste solo lato client e il server lo riceve solo quando è già stato dichiarato.

Lezione su Count

Per rimanere in tema di similitudini con l’SQL, Mongo ci offre anche la funzione count che restituisce il numero di elementi corrispondenti alla condizione.

>db.scores.count( {} )

Ha le stesse proprietà del find, quindi possiamo inserire un documento vuoto per ottenere il totale di tutti i documenti nella collection oppure inserire delle condizioni per contare solo quelli che la soddisfano.