Hvis MapReduce har vært din favoritt, kan det være på tide å gå over til MongoDBs Aggregation Pipeline for å takle komplekse operasjoner.

Aggregeringsrørledningen er den anbefalte måten å kjøre komplekse spørringer i MongoDB. Hvis du har brukt MongoDBs MapReduce, bør du bytte til aggregeringsrørledningen for mer effektive beregninger.

Hva er aggregering i MongoDB og hvordan fungerer det?

Aggregeringsrørledningen er en flertrinnsprosess for å kjøre avansert spørringer i MongoDB. Den behandler data gjennom forskjellige stadier kalt en rørledning. Du kan bruke resultatene generert fra ett nivå som en operasjonsmal i et annet.

Du kan for eksempel overføre resultatet av en matchoperasjon til et annet trinn for sortering i den rekkefølgen til du får ønsket utgang.

Hvert trinn i en aggregeringsrørledning har en MongoDB-operatør og genererer ett eller flere transformerte dokumenter. Avhengig av søket ditt, kan et nivå vises flere ganger i pipelinen. Det kan for eksempel hende du må bruke $count eller $sort operatørstadier mer enn én gang på tvers av aggregeringsrørledningen.

instagram viewer

Stadiene av aggregasjonsrørledningen

Aggregeringsrørledningen sender data gjennom flere stadier i en enkelt spørring. Det er flere stadier, og du kan finne detaljene deres i MongoDB dokumentasjon.

La oss definere noen av de mest brukte nedenfor.

$match-stadiet

Dette stadiet hjelper deg med å definere spesifikke filtreringsbetingelser før du starter de andre aggregeringsstadiene. Du kan bruke den til å velge samsvarende data du vil inkludere i aggregeringspipelinen.

$gruppescenen

Gruppestadiet skiller data inn i ulike grupper basert på spesifikke kriterier ved hjelp av nøkkelverdi-par. Hver gruppe representerer en nøkkel i utdatadokumentet.

Tenk for eksempel på følgende salg eksempeldata:

Ved å bruke aggregeringspipelinen kan du beregne det totale salgsantallet og toppsalget for hver produktseksjon:

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

De _id: $Section pargrupper utdatadokumentet basert på seksjonene. Ved å spesifisere topp_salg_antall og topp_salg felt, oppretter MongoDB nye nøkler basert på operasjonen definert av aggregatoren; dette kan være $sum, $min, $maks, eller $avg.

$hopp-stadiet

Du kan bruke $hopp trinn for å utelate et spesifisert antall dokumenter i utdataene. Det kommer vanligvis etter gruppespillet. For eksempel, hvis du forventer to utdatadokumenter, men hopper over ett, vil aggregeringen bare gi ut det andre dokumentet.

For å legge til et hoppstadium, sett inn $hopp operasjon inn i aggregeringsrørledningen:

...,
{
$skip: 1
},

$sort-scenen

Sorteringstrinnet lar deg ordne data i synkende eller stigende rekkefølge. For eksempel kan vi sortere dataene i det forrige spørringseksemplet i synkende rekkefølge for å finne ut hvilken del som har det høyeste salget.

Legg til $sort operatør til forrige spørring:

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

$limit-stadiet

Begrensningsoperasjonen bidrar til å redusere antallet utdatadokumenter du vil at aggregeringsrørledningen skal vise. Bruk for eksempel $grense operatør for å få seksjonen med det høyeste salget returnert fra forrige trinn:

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

{"$limit": 1}

Ovennevnte returnerer bare det første dokumentet; dette er seksjonen med høyest salg, slik den vises på toppen av den sorterte produksjonen.

$prosjektstadiet

De $prosjekt trinn lar deg forme utdatadokumentet slik du vil. Bruker $prosjekt operatør, kan du spesifisere hvilket felt som skal inkluderes i utdataene og tilpasse nøkkelnavnet.

For eksempel en prøveutgang uten $prosjekt scenen ser slik ut:

La oss se hvordan det ser ut med $prosjekt scene. For å legge til $prosjekt til rørledningen:

...,

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

}
}

Siden vi tidligere har gruppert dataene basert på produktseksjoner, inkluderer ovenstående hver produktseksjon i utdatadokumentet. Det sikrer også at det aggregerte antall salg og toppsalg vises i produksjonen som TotalSold og Toppsalg.

Den endelige utgangen er mye renere sammenlignet med den forrige:

$unwind-scenen

De $slappe av scenen bryter ned en matrise i et dokument til individuelle dokumenter. Ta følgende Bestillinger data, for eksempel:

Bruke $slappe av scenen for å dekonstruere gjenstander array før du bruker andre aggregeringsstadier. For eksempel å slappe av gjenstander array er fornuftig hvis du vil beregne den totale inntekten for hvert produkt:

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",

}
}
])

Her er resultatet av aggregeringsspørringen ovenfor:

Hvordan lage en aggregasjonsrørledning i MongoDB

Mens aggregeringspipelinen inkluderer flere operasjoner, gir de tidligere omtalte stadiene deg en ide om hvordan du bruker dem i pipelinen, inkludert den grunnleggende spørringen for hver.

Bruker den forrige salg dataeksempel, la oss ha noen av stadiene diskutert ovenfor i ett stykke for et bredere syn på aggregeringsrørledningen:

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",

}
}

])

Den endelige utgangen ser ut som noe du har sett tidligere:

Aggregasjonsrørledning vs. Kart reduksjon

Inntil den ble avviklet fra MongoDB 5.0, var den konvensjonelle måten å samle data i MongoDB på via MapReduce. Selv om MapReduce har bredere applikasjoner utover MongoDB er det mindre effektivt enn aggregeringsrørledningen, og krever tredjeparts skripting for å skrive kartet og redusere funksjoner separat.

Aggregeringsrørledningen, derimot, er kun spesifikk for MongoDB. Men det gir en renere og mer effektiv måte å utføre komplekse spørringer på. I tillegg til enkelhet og skalerbarhet for spørringer, gjør de omtalte pipeline-trinnene utdataene mer tilpassbare.

Det er mange flere forskjeller mellom aggregeringsrørledningen og MapReduce. Du vil se dem når du bytter fra MapReduce til aggregeringsrørledningen.

Gjør Big Data Queries effektive i MongoDB

Din spørring må være så effektiv som mulig hvis du ønsker å kjøre dybdeberegninger på komplekse data i MongoDB. Aggregeringsrørledningen er ideell for avansert spørring. I stedet for å manipulere data i separate operasjoner, som ofte reduserer ytelsen, lar aggregering deg pakke dem alle inne i en enkelt ytelsespipeline og utføre dem én gang.

Mens aggregeringsrørledningen er mer effektiv enn MapReduce, kan du gjøre aggregeringen raskere og mer effektiv ved å indeksere dataene dine. Dette begrenser mengden data MongoDB trenger å skanne under hvert aggregeringstrinn.