Se MapReduce è stato il tuo punto di riferimento, ora potrebbe essere il momento di passare alla Aggregation Pipeline di MongoDB per affrontare operazioni complesse.

La pipeline di aggregazione è il modo consigliato per eseguire query complesse in MongoDB. Se utilizzi MapReduce di MongoDB, è meglio passare alla pipeline di aggregazione per calcoli più efficienti.

Cos'è l'aggregazione in MongoDB e come funziona?

La pipeline di aggregazione è un processo in più fasi per l'esecuzione avanzata query in MongoDB. Elabora i dati attraverso diverse fasi chiamate pipeline. È possibile utilizzare i risultati generati da un livello come modello di operazione in un altro.

Ad esempio, puoi passare il risultato di un'operazione di corrispondenza a un'altra fase per ordinarlo in quell'ordine finché non ottieni l'output desiderato.

Ogni fase di una pipeline di aggregazione presenta un operatore MongoDB e genera uno o più documenti trasformati. A seconda della query, un livello può apparire più volte nella pipeline. Ad esempio, potrebbe essere necessario utilizzare il file

instagram viewer
$conteggio O $ordina l'operatore esegue più fasi nella pipeline di aggregazione.

Le fasi della pipeline di aggregazione

La pipeline di aggregazione passa i dati attraverso più fasi in un'unica query. Esistono diverse fasi e puoi trovare i loro dettagli nella Documentazione MongoDB.

Di seguito definiamo alcuni di quelli più comunemente utilizzati.

La fase $match

Questa fase consente di definire condizioni di filtraggio specifiche prima di avviare le altre fasi di aggregazione. Puoi utilizzarlo per selezionare i dati corrispondenti che desideri includere nella pipeline di aggregazione.

La fase a gironi

La fase a gironi separa i dati in diversi gruppi in base a criteri specifici utilizzando coppie chiave-valore. Ciascun gruppo rappresenta una chiave nel documento di output.

Ad esempio, considera quanto segue saldi dati di esempio:

Utilizzando la pipeline di aggregazione, puoi calcolare il conteggio totale delle vendite e le vendite principali per ciascuna sezione di prodotto:

{
$group: {
_id: $Section,
total_sales_count: {$sum: $Sold},
top_sales: {$max: $Amount},
}
}

IL _id: $Sezione coppia raggruppa il documento di output in base alle sezioni. Specificando il top_sales_count E Più venduti campi, MongoDB crea nuove chiavi in ​​base all'operazione definita dall'aggregatore; questo può essere $somma, $min, $massimo, O $media.

La fase $skip

Puoi usare il $salta fase per omettere un numero specificato di documenti nell'output. Di solito arriva dopo la fase a gironi. Ad esempio, se si prevedono due documenti di output ma ne si salta uno, l'aggregazione produrrà solo il secondo documento.

Per aggiungere una fase di salto, inserire il file $salta operazione nella pipeline di aggregazione:

...,
{
$skip: 1
},

La fase $sort

La fase di ordinamento consente di disporre i dati in ordine decrescente o crescente. Ad esempio, possiamo ordinare ulteriormente i dati nell'esempio di query precedente in ordine decrescente per determinare quale sezione ha le vendite più elevate.

Aggiungi il $ordina operatore alla query precedente:

...,
{
$sort: {top_sales: -1}
},

La fase $limit

L'operazione di limite aiuta a ridurre il numero di documenti di output che si desidera vengano visualizzati dalla pipeline di aggregazione. Ad esempio, utilizzare il $limite operatore per ottenere la sezione con le vendite più elevate restituite dalla fase precedente:

...,
{
$sort: {top_sales: -1}
},

{"$limit": 1}

Quanto sopra restituisce solo il primo documento; questa è la sezione con le vendite più elevate, poiché appare nella parte superiore dell'output ordinato.

La fase del progetto $

IL $progetto stage ti consente di modellare il documento di output come preferisci. Usando il $progetto operatore, è possibile specificare quale campo includere nell'output e personalizzarne il nome della chiave.

Ad esempio, un output di esempio senza il file $progetto il palco si presenta così:

Vediamo come appare con il $progetto palcoscenico. Per aggiungere il $progetto al gasdotto:

...,

{
"$project": {
"_id": 0,
"Section": "$_id",
"TotalSold": "$total_sales_count",
"TopSale": "$top_sales",

}
}

Poiché in precedenza abbiamo raggruppato i dati in base alle sezioni del prodotto, quanto sopra include ciascuna sezione del prodotto nel documento di output. Garantisce inoltre che il conteggio delle vendite aggregate e le vendite principali siano presenti nell'output come Totale venduto E TopSale.

L'output finale è molto più pulito rispetto al precedente:

La fase di rilassamento

IL $rilassarsi La fase suddivide un array all'interno di un documento in singoli documenti. Prendi quanto segue Ordini dati, ad esempio:

Usa il $rilassarsi fase di decostruire il elementi array prima di applicare altre fasi di aggregazione. Ad esempio, svolgendo il elementi array ha senso se vuoi calcolare le entrate totali per ciascun prodotto:

db.Orders.aggregate(
[
{
"$unwind": "$items"
},
{
"$group": {
"_id": "$items.product",
"total_revenue": { "$sum": { "$multiply": ["$items.quantity", "$items.price"] } }
}
},
{
"$sort": { "total_revenue": -1 }
},

{
"$project": {
"_id": 0,
"Product": "$_id",
"TotalRevenue": "$total_revenue",

}
}
])

Ecco il risultato della query di aggregazione precedente:

Come creare una pipeline di aggregazione in MongoDB

Sebbene la pipeline di aggregazione includa diverse operazioni, le fasi descritte in precedenza forniscono un'idea di come applicarle nella pipeline, inclusa la query di base per ciascuna.

Utilizzando il precedente saldi campione di dati, raccogliamo alcune delle fasi discusse in precedenza in un unico pezzo per una visione più ampia della pipeline di aggregazione:

db.sales.aggregate([

{
"$match": {
"Sold": { "$gte": 5 }
}
},

{

"$group": {
"_id": "$Section",
"total_sales_count": { "$sum": "$Sold" },
"top_sales": { "$max": "$Amount" },

}

},

{
"$sort": { "top_sales": -1 }
},

{"$skip": 0},

{
"$project": {
"_id": 0,
"Section": "$_id",
"TotalSold": "$total_sales_count",
"TopSale": "$top_sales",

}
}

])

L'output finale assomiglia a qualcosa che hai visto in precedenza:

Pipeline di aggregazione vs. Riduci mappa

Fino alla sua deprecazione a partire da MongoDB 5.0, il modo convenzionale per aggregare i dati in MongoDB era tramite MapReduce. Sebbene MapReduce ha applicazioni più ampie oltre a MongoDB, è meno efficiente della pipeline di aggregazione, poiché richiede script di terze parti per scrivere la mappa e ridurre le funzioni separatamente.

La pipeline di aggregazione, invece, è specifica solo per MongoDB. Ma fornisce un modo più pulito ed efficiente per eseguire query complesse. Oltre alla semplicità e alla scalabilità delle query, le fasi della pipeline presenti rendono l'output più personalizzabile.

Ce ne sono molti altri differenze tra la pipeline di aggregazione e MapReduce. Li vedrai quando passi da MapReduce alla pipeline di aggregazione.

Rendi efficienti le query sui Big Data in MongoDB

La tua query deve essere il più efficiente possibile se desideri eseguire calcoli approfonditi su dati complessi in MongoDB. La pipeline di aggregazione è ideale per le query avanzate. Invece di manipolare i dati in operazioni separate, cosa che spesso riduce le prestazioni, l'aggregazione consente di raggrupparli tutti in un'unica pipeline performante ed eseguirli una volta.

Sebbene la pipeline di aggregazione sia più efficiente di MapReduce, puoi rendere l'aggregazione più rapida ed efficiente indicizzando i tuoi dati. Ciò limita la quantità di dati che MongoDB deve scansionare durante ogni fase di aggregazione.