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.