Le operazioni di aggregazione elaborano record di dati e restituiscono risultati calcolati. Le operazioni di aggregazione raggruppano i valori di più documenti e possono eseguire una varietà di operazioni sui dati raggruppati per restituire un singolo risultato. In SQL count(*) e con group by è un equivalente dell’aggregazione MongoDB.
Il metodo aggregate()
Per l’aggregazione in MongoDB, si dovrebbe usare il metodo aggregate().
Sintassi
La sintassi di base del metodo aggregate() è la seguente –
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
Esempio
Nella collezione hai i seguenti dati –
{ _id: ObjectId(7df78ad8902c) title: 'MongoDB Overview', description: 'MongoDB is no sql database', by_user: 'tutorials point', url: 'http://www.tutorialspoint.com', tags: , likes: 100},{ _id: ObjectId(7df78ad8902d) title: 'NoSQL Overview', description: 'No sql database is very fast', by_user: 'tutorials point', url: 'http://www.tutorialspoint.com', tags: , likes: 10},{ _id: ObjectId(7df78ad8902e) title: 'Neo4j Overview', description: 'Neo4j is no sql database', by_user: 'Neo4j', url: 'http://www.neo4j.com', tags: , likes: 750},
Ora dalla collezione sopra, se vuoi visualizzare una lista che indichi quanti tutorial sono stati scritti da ogni utente, allora userai il seguente metodo aggregate() –
> db.mycol.aggregate(){ "_id" : "tutorials point", "num_tutorial" : 2 }{ "_id" : "Neo4j", "num_tutorial" : 1 }>
La query equivalente a Sql per il caso d’uso sopra sarà select by_user, count(*) from mycol group by by_user.
Nell’esempio di cui sopra, abbiamo raggruppato i documenti per campo by_user e ad ogni occorrenza di by_user viene incrementato il valore precedente della somma. Segue una lista delle espressioni di aggregazione disponibili.
Espressione | Descrizione | Esempio |
---|---|---|
$sum | Somma il valore definito da tutti i documenti della collezione. | db.mycol.aggregate() |
$avg | Calcola la media di tutti i valori dati da tutti i documenti dell’insieme. | db.mycol.aggregate() |
$min | Riceve il minimo dei valori corrispondenti da tutti i documenti dell’insieme. | db.mycol.aggregate() |
$max | Riceve il massimo dei valori corrispondenti da tutti i documenti dell’insieme. | db.mycol.aggregate() |
$push | Inserisce il valore in un array nel documento risultante. | db.mycol.aggregate() |
$addToSet | Inserisce il valore in un array nel documento risultante, ma non crea duplicati. | db.mycol.aggregate() |
$first | Prende il primo documento dai documenti di origine secondo il raggruppamento. Tipicamente questo ha senso solo insieme a qualche “$sort”-stage applicato in precedenza. | db.mycol.aggregate() |
$last | Riceve l’ultimo documento dai documenti sorgente secondo il raggruppamento. Tipicamente questo ha senso solo insieme a qualche “$sort”-stage applicato in precedenza. | db.mycol.aggregate() |
Concezione di pipeline
Nel comando UNIX, pipeline di shell significa la possibilità di eseguire un’operazione su qualche input e usare l’output come input per il comando successivo e così via. Anche MongoDB supporta lo stesso concetto nel framework di aggregazione. C’è un insieme di possibili fasi e ognuna di queste viene presa come un insieme di documenti come input e produce un insieme di documenti risultante (o il documento JSON finale risultante alla fine della pipeline). Questo può poi a sua volta essere usato per la fase successiva e così via.
Seguono le possibili fasi nel framework di aggregazione –
-
$project – Usato per selezionare alcuni campi specifici da una collezione.
-
$match – Questa è un’operazione di filtraggio e quindi può ridurre la quantità di documenti che sono dati come input allo stadio successivo.
-
$group – Questo fa l’aggregazione effettiva come discusso sopra.
-
$sort – Ordina i documenti.
-
$skip – Con questo, è possibile saltare in avanti nella lista dei documenti per una data quantità di documenti.
-
$limit – Questo limita la quantità di documenti da guardare, per il numero dato a partire dalle posizioni correnti.
-
$unwind – Questo è usato per svolgere i documenti che stanno usando gli array. Quando si usa un array, i dati sono come pre-uniti e questa operazione sarà annullata con questo per avere di nuovo documenti individuali. Così con questa fase aumenteremo la quantità di documenti per la fase successiva.