MongoDB - Aggregazione
Le operazioni di aggregazione elaborano i record di dati e restituiscono i risultati calcolati. Le operazioni di aggregazione raggruppano i valori di più documenti e possono eseguire una serie di operazioni sui dati raggruppati per restituire un unico risultato. In SQL count (*) e con group by è un equivalente dell'aggregazione MongoDB.
Il metodo aggregate ()
Per l'aggregazione in MongoDB, dovresti usare aggregate() metodo.
Sintassi
Sintassi di base di aggregate() metodo è il seguente:
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
Esempio
Nella raccolta 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: ['mongodb', 'database', 'NoSQL'],
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: ['mongodb', 'database', 'NoSQL'],
likes: 10
},
{
_id: ObjectId(7df78ad8902e)
title: 'Neo4j Overview',
description: 'Neo4j is no sql database',
by_user: 'Neo4j',
url: 'http://www.neo4j.com',
tags: ['neo4j', 'database', 'NoSQL'],
likes: 750
},
Ora dalla raccolta sopra, se vuoi visualizzare un elenco che indica quanti tutorial sono scritti da ciascun utente, allora utilizzerai quanto segue aggregate() metodo -
> db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
{ "_id" : "tutorials point", "num_tutorial" : 2 }
{ "_id" : "Neo4j", "num_tutorial" : 1 }
>
La query SQL equivalente per il caso d'uso precedente sarà select by_user, count(*) from mycol group by by_user.
Nell'esempio sopra, abbiamo raggruppato i documenti per campo by_usere ad ogni occorrenza dell'utente il valore precedente di sum viene incrementato. Di seguito è riportato un elenco di espressioni di aggregazione disponibili.
Espressione | Descrizione | Esempio |
---|---|---|
$ somma | Riassume il valore definito da tutti i documenti nella raccolta. | db.mycol.aggregate ([{$ group: {_id: "$ by_user", num_tutorial: {$ sum: "$ likes"}}}]) |
$ avg | Calcola la media di tutti i valori dati da tutti i documenti nella raccolta. | db.mycol.aggregate ([{$ group: {_id: "$ by_user", num_tutorial: {$ avg: "$ likes"}}}]) |
$ min | Ottiene il minimo dei valori corrispondenti da tutti i documenti nella raccolta. | db.mycol.aggregate ([{$ group: {_id: "$ by_user", num_tutorial: {$ min: "$ likes"}}}]) |
$ max | Ottiene il massimo dei valori corrispondenti da tutti i documenti nella raccolta. | db.mycol.aggregate ([{$ group: {_id: "$ by_user", num_tutorial: {$ max: "$ likes"}}}]) |
$ push | Inserisce il valore in una matrice nel documento risultante. | db.mycol.aggregate ([{$ group: {_id: "$ by_user", url: {$ push: "$ url"}}}]) |
$ addToSet | Inserisce il valore in una matrice nel documento risultante ma non crea duplicati. | db.mycol.aggregate ([{$ group: {_id: "$ by_user", url: {$ addToSet: "$ url"}}}]) |
$ primo | Ottiene il primo documento dai documenti di origine in base al raggruppamento. In genere questo ha senso solo insieme ad alcune fasi "$ sort" precedentemente applicate. | db.mycol.aggregate ([{$ group: {_id: "$ by_user", first_url: {$ first: "$ url"}}}]) |
$ last | Ottiene l'ultimo documento dai documenti di origine in base al raggruppamento. In genere questo ha senso solo insieme ad alcune fasi "$ sort" precedentemente applicate. | db.mycol.aggregate ([{$ group: {_id: "$ by_user", last_url: {$ last: "$ url"}}}]) |
Concetto di pipeline
Nel comando UNIX, la pipeline della shell indica la possibilità di eseguire un'operazione su alcuni input e utilizzare l'output come input per il comando successivo e così via. MongoDB supporta anche lo stesso concetto nel framework di aggregazione. Esiste una serie di fasi possibili e ciascuna di esse viene presa come una serie di documenti come input e produce una serie di documenti risultante (o il documento JSON finale risultante alla fine della pipeline). Questo può quindi essere utilizzato a sua volta per la fase successiva e così via.
Di seguito sono riportate le possibili fasi nel quadro di aggregazione:
$project - Utilizzato per selezionare alcuni campi specifici da una raccolta.
$match - Questa è un'operazione di filtraggio e quindi può ridurre la quantità di documenti che vengono forniti come input per la fase successiva.
$group - Questo fa l'effettiva aggregazione come discusso sopra.
$sort - Ordina i documenti.
$skip - Con questo, è possibile saltare in avanti nell'elenco dei documenti per una data quantità di documenti.
$limit - Questo limita la quantità di documenti da guardare, dal numero dato a partire dalle posizioni correnti.
$unwind- Viene utilizzato per srotolare documenti che utilizzano array. Quando si utilizza un array, i dati sono una specie di preunione e questa operazione verrà annullata per avere nuovamente i singoli documenti. Quindi con questa fase aumenteremo la quantità di documenti per la fase successiva.