La funzione di ag­gre­ga­zio­ne in MongoDB è uno strumento prezioso che consente di ana­liz­za­re e filtrare i database. Il sistema di pipeline facilita la spe­ci­fi­ca­zio­ne delle richieste e quindi anche degli output in modo molto in­di­vi­dua­le.

Che cos’è l’ag­gre­ga­zio­ne in MongoDB?

MongoDB è un database orientato ai documenti non re­la­zio­na­le, pro­get­ta­to per essereuti­liz­za­to con grandi quantità di dati diversi. Grazie alla rinuncia a tabelle rigide e a tecniche come lo sharding, in cui i dati sono ar­chi­via­ti su nodi diversi, la soluzione NoSQL può essere scalata oriz­zon­tal­men­te rimanendo molto fles­si­bi­le e sicura contro eventuali guasti.

I documenti nel formato binario JSON BSON sono rag­grup­pa­ti in co­sid­det­te raccolte e possono essere in­ter­ro­ga­ti e mo­di­fi­ca­ti uti­liz­zan­do MongoDB Query Language. Benché questo lin­guag­gio offra molte opzioni, non è adatto all’analisi dei dati. A tale scopo, MongoDB offre l’ag­gre­ga­zio­ne.

In in­for­ma­ti­ca questo termine viene uti­liz­za­to per de­scri­ve­re vari processi. In ri­fe­ri­men­to a MongoDB, per ag­gre­ga­zio­ne si intende la de­ter­mi­na­zio­ne di in­for­ma­zio­ni sin­te­tiz­za­te. Pertanto, i dati pro­ve­nien­ti da uno o più documenti vengono ana­liz­za­ti e filtrati in base ad alcuni fattori definiti. Al termine di questo processo si ottiene un risultato unico e chiaro. In questo articolo non solo spie­ghe­re­mo le pos­si­bi­li­tà che l’ag­gre­ga­zio­ne offre su MongoDB per un’analisi completa dei dati, ma mo­stre­re­mo anche esempi di come uti­liz­za­re il metodo aggregate ( ) per il sistema di gestione dei database.

Ag­gre­ga­zio­ne in MongoDB: pre­pa­ra­zio­ne e pre­re­qui­si­ti

Per uti­liz­za­re l’ag­gre­ga­zio­ne in MongoDB, è ne­ces­sa­rio sod­di­sfa­re solo alcuni requisiti. La procedura viene eseguita nella shell e funziona secondo regole logiche che si possono applicare alle proprie esigenze in­di­vi­dua­li. MongoDB deve essere già in­stal­la­to sul computer. Per sapere come scaricare, in­stal­la­re ed eseguire il database per la prima volta, consulta il nostro tutorial completo di MongoDB. Occorre inoltre uti­liz­za­re un firewall potente e aver già con­fi­gu­ra­to il database in base a tutti gli standard di sicurezza attuali. Per eseguire l’ag­gre­ga­zio­ne su MongoDB, devi as­si­cu­rar­ti di disporre dei privilegi di am­mi­ni­stra­zio­ne. Il database funziona su tutte le piat­ta­for­me, quindi i passaggi descritti di seguito sono validi per tutti i sistemi operativi.

Il ruolo della pipeline per l’ag­gre­ga­zio­ne in MongoDB

In MongoDB è possibile anche ef­fet­tua­re semplici ricerche o in­ter­ro­ga­zio­ni. Il database fornirà im­me­dia­ta­men­te i risultati de­si­de­ra­ti. Si tratta tuttavia di un metodo molto limitato, in quanto può pre­sen­ta­re solo i risultati già presenti nei documenti ar­chi­via­ti. Questo tipo di query non è destinato ad analisi più ap­pro­fon­di­te, modelli ri­cor­ren­ti o ulteriori in­for­ma­zio­ni. Talvolta, però, è ne­ces­sa­rio prendere in con­si­de­ra­zio­ne diverse fonti all’interno di un database per trarre con­clu­sio­ni si­gni­fi­ca­ti­ve. Per queste esigenze si utilizza l’ag­gre­ga­zio­ne in MongoDB. Per ottenere un risultato, il metodo si avvale delle co­sid­det­te pipeline.

Qual è la funzione della pipeline?

Le pipeline di ag­gre­ga­zio­ne in MongoDB sono processi in cui i dati esistenti vengono ana­liz­za­ti e filtrati con l’aiuto di vari passaggi intermedi, con lo scopo di vi­sua­liz­za­re il risultato cercato dall’utente. Tali passaggi intermedi sono noti come stadi. In base ai requisiti, è possibile avviare uno o più stadi. Gli stadi vengono eseguiti uno dopo l’altro e mo­di­fi­ca­no l’input originale in modo che alla fine venga vi­sua­liz­za­to l’output de­si­de­ra­to. Mentre l’input è composto da numerosi dati, l’output, cioè il risultato finale, è unico. Tra poco spie­ghe­re­mo i diversi stadi offerti dalla funzione di ag­gre­ga­zio­ne in MongoDB.

Come si presenta la sintassi della pipeline di ag­gre­ga­zio­ne in MongoDB?

Per prima cosa, vale la pena di dare una breve occhiata alla sintassi di base del metodo di ag­gre­ga­zio­ne in MongoDB. La struttura del metodo è sempre la stessa e può essere per­so­na­liz­za­ta in base alle esigenze spe­ci­fi­che. In pratica, la struttura di base è la seguente:

db.collection_name.aggregate ( pipeline, options )
shell

Qui, collection_name è il nome della raccolta con­si­de­ra­ta. Le fasi richieste o de­si­de­ra­te di un’ag­gre­ga­zio­ne MongoDB sono elencate sotto pipeline, mentre options può essere usato per indicare ulteriori parametri opzionali che spe­ci­fi­ca­no l’output richiesto.

Quali stadi ci sono?

La pipeline di ag­gre­ga­zio­ne in MongoDB prevede numerosi stadi. La maggior parte di essi può essere uti­liz­za­ta più volte all’interno di una pipeline. Elencarli tutti andrebbe oltre lo scopo di questo articolo, so­prat­tut­to perché alcuni servono solo per ope­ra­zio­ni molto spe­ci­fi­che. A titolo in­di­ca­ti­vo, tuttavia, elen­che­re­mo qui alcuni degli stadi più fre­quen­te­men­te uti­liz­za­ti:

  • $count: indica quanti documenti BSON sono stati presi in con­si­de­ra­zio­ne per lo stadio o gli stadi di questa pipeline.
  • $group: ordina e raggruppa i documenti in base a de­ter­mi­na­ti parametri.
  • $limit: serve a ridurre i documenti vi­sua­liz­za­ti.
  • $match: limita i documenti che vengono uti­liz­za­ti per lo stadio suc­ces­si­vo.
  • $out: include i risultati dell’ag­gre­ga­zio­ne MongoDB nella raccolta. Questo stadio può essere usato solo alla fine di una pipeline.
  • $project: seleziona de­ter­mi­na­ti campi di una raccolta.
  • $skip: ignora un certo numero di documenti. Va spe­ci­fi­ca­to per mezzo di un’opzione.
  • $sort: ordina i documenti secondo un metodo a scelta. Tuttavia, i documenti non vengono mo­di­fi­ca­ti oltre.
  • $unset: esclude alcuni campi, pertanto svolge la funzione opposta di $project.

Ag­gre­ga­zio­ne in MongoDB: alcuni esempi pratici

Per spiegare come funziona con­cre­ta­men­te l’ag­gre­ga­zio­ne in MongoDB, mo­stre­re­mo ora alcuni esempi di diversi stadi e come uti­liz­zar­li. Per usare l’ag­gre­ga­zio­ne, apri la shell come am­mi­ni­stra­to­re. In genere, per prima cosa viene vi­sua­liz­za­to un database di prova. Qualora tu intenda uti­liz­za­re un database diverso, puoi ricorrere al comando use.

A titolo di esempio, ipo­tiz­zia­mo un database che contenga i dati della clientela che ha ac­qui­sta­to un de­ter­mi­na­to prodotto. Per chiarezza, questo database contiene solo dieci documenti strut­tu­ra­ti secondo lo stesso schema. L’esempio è il seguente:

{
	"name" : "Greco",
	"city" : "Bologna",
	"country" : "Italy",
	"quantity" : 14
}
shell

Le in­for­ma­zio­ni note per ogni ac­qui­ren­te sono quindi il nome, il luogo di residenza, il paese e il numero di prodotti ac­qui­sta­ti.

Per spe­ri­men­ta­re l’ag­gre­ga­zio­ne in MongoDB, applica il metodo insertMany ( ) per ag­giun­ge­re tutti i documenti con i dati della clientela all’insieme “clienti”:

db.clienti.insertMany ( [
	{ "name" : "Greco", "city" : "Bologna", "country" : "Italy", "quantity" : 14 },
	{ "name" : "Meyer", "city" : "Hamburg", "country" : "Germany", "quantity" : 26 },
	{ "name" : "Lee", "city" : "Birmingham", "country" : "England", "quantity" : 5 },
	{ "name" : "Rodriguez", "city" : "Madrid", "country" : "Spain", "quantity" : 19 },
	{ "name" : "Nowak", "city" : "Krakow", "country" : "Poland", "quantity" : 13 },
{ "name" : "Rossi", "city" : "Milan", "country" : "Italy", "quantity" : 10 },
{ "name" : "Arslan", "city" : "Ankara", "country" : "Turkey", "quantity" : 18 },
{ "name" : "Martin", "city" : "Lyon", "country" : "France", "quantity" : 9 },
{ "name" : "Mancini", "city" : "Rome", "country" : "Italy", "quantity" : 21 },
{ "name" : "Schulz", "city" : "Munich", "country" : "Germany", "quantity" : 2 }
] )
shell

Eseguendo questi dati, verrà vi­sua­liz­za­to un elenco di ID oggetto per ogni singolo documento.

Come usare $match

Per il­lu­stra­re le pos­si­bi­li­tà offerte dall’ag­gre­ga­zio­ne in MongoDB, per prima cosa ap­pli­chia­mo lo stadio $match alla nostra raccolta “clienti”. In assenza di ulteriori parametri, il metodo mo­stre­reb­be sem­pli­ce­men­te l’elenco completo dei dati della clientela elencati in pre­ce­den­za. Nell’esempio seguente, invece, istruiamo il metodo affinché ci mostri soltanto la clientela italiana. Il comando corretto è il seguente:

db.clienti.aggregate ( [
	{ $match : { "country" : "Italy" } }
] )
shell

L’output mostrerà soltanto gli ID degli oggetti e i dati della clientela italiana.

$sort per una migliore visione d’insieme

Per ordinare il database dei clienti, si può ricorrere all’ag­gre­ga­zio­ne in MongoDB con lo stadio $sort. Nel seguente esempio, istruiamo il sistema a ordinare tutti i dati relativi alla clientela in base al numero di unità ac­qui­sta­te, partendo dal numero più alto. Per il nostro esempio, l’input corretto è il seguente:

db.clienti.aggregate ( [
	{ $sort : { "quantity" : -1 } }
] )
shell

Limitare l’output con $project

Con gli stadi uti­liz­za­ti finora, si noterà che l’output è re­la­ti­va­men­te ampio. Accanto alle in­for­ma­zio­ni effettive contenute nei documenti, viene ad esempio sempre emesso anche l’ID dell’oggetto. Nella pipeline di ag­gre­ga­zio­ne in MongoDB si può usare $project per de­ter­mi­na­re quali in­for­ma­zio­ni devono essere emesse. A tal fine, si imposta il valore 1 per i campi ob­bli­ga­to­ri e 0 per quelli superflui. Nel nostro esempio, vorremmo vedere solo il nome e il numero di prodotti ac­qui­sta­ti. Per farlo inseriamo questo valore:

db.clienti.aggregate ( [
	{ $project : { _id : 0, name : 1, city : 0, country : 0, quantity : 1 } }
] )
shell

Combinare più stadi per l’ag­gre­ga­zio­ne MongoDB

L’ag­gre­ga­zio­ne in MongoDB offre sempre la pos­si­bi­li­tà di applicare più stadi in suc­ces­sio­ne. Questi vengono eseguiti uno dopo l’altro e alla fine il risultato è un output che tiene conto di tutti i parametri de­si­de­ra­ti. Per esempio, per vi­sua­liz­za­re solo i nomi e gli acquisti ef­fet­tua­ti dalla clientela italiana in ordine de­cre­scen­te, si possono uti­liz­za­re le fasi descritte in pre­ce­den­za come segue:

db.clienti.aggregate ( [
	{ $match : { "country" : "Italy" } }
	{ $project : { _id : 0, name : 1, city : 0, country : 0, quantity : 1 } }
	{ $sort : { "quantity" : -1 } }
] )
shell
Consiglio

Vuoi saperne di più su MongoDB? Nella nostra Digital Guide trovi tutto ciò di cui hai bisogno. Ad esempio, ti spie­ghia­mo come funziona il comando List Databases e come uti­liz­za­re Sort in MongoDB per spe­ci­fi­ca­re l’ordine dei dati in uscita.

Vai al menu prin­ci­pa­le