Jei naudojote „MapReduce“, dabar gali būti laikas pereiti prie „MongoDB“ agregavimo vamzdyno, kad būtų galima atlikti sudėtingas operacijas.

Agregavimo vamzdynas yra rekomenduojamas būdas vykdyti sudėtingas užklausas MongoDB. Jei naudojote MongoDB MapReduce, geriau pereikite prie agregavimo dujotiekio, kad skaičiavimai būtų efektyvesni.

Kas yra agregavimas MongoDB ir kaip jis veikia?

Sumavimo dujotiekis yra kelių etapų procesas, skirtas pažangiems paleisti užklausos MongoDB. Jis apdoroja duomenis įvairiais etapais, vadinamais dujotiekiu. Vieno lygio sugeneruotus rezultatus galite naudoti kaip operacijos šabloną kitame.

Pavyzdžiui, suderinimo operacijos rezultatą galite perkelti į kitą etapą ir rūšiuoti ta tvarka, kol gausite norimą išvestį.

Kiekviename agregavimo dujotiekio etape yra MongoDB operatorius ir generuojamas vienas ar daugiau transformuotų dokumentų. Atsižvelgiant į jūsų užklausą, lygis gali būti rodomas kelis kartus. Pavyzdžiui, jums gali tekti naudoti $skaičiuoti arba $rūšiuoti operatorius daugiau nei vieną kartą eina per agregavimo dujotiekį.

instagram viewer

Sumavimo vamzdyno etapai

Agregavimo dujotiekis perduoda duomenis per kelis etapus vienoje užklausoje. Yra keli etapai, kurių informaciją galite rasti MongoDB dokumentacija.

Toliau apibūdinkime kai kuriuos dažniausiai naudojamus.

$match etapas

Šis etapas padeda apibrėžti konkrečias filtravimo sąlygas prieš pradedant kitus agregavimo etapus. Galite naudoti jį norėdami pasirinkti atitinkančius duomenis, kuriuos norite įtraukti į kaupimo dujotiekį.

$grupės etapas

Grupės etape duomenys suskirstomi į skirtingas grupes pagal konkrečius kriterijus, naudojant raktų ir reikšmių poras. Kiekviena grupė reiškia raktą išvesties dokumente.

Pavyzdžiui, apsvarstykite šiuos dalykus pardavimai duomenų pavyzdžiai:

Naudodami apibendrinimo dujotiekį galite apskaičiuoti bendrą kiekvienos produkto skilties pardavimo skaičių ir didžiausius pardavimus:

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

The _id: $Section pora sugrupuoja išvesties dokumentą pagal skyrius. Nurodydami didžiausias_pardavimų_skaičius ir top_pardavimai laukus, MongoDB sukuria naujus raktus pagal agregatoriaus apibrėžtą operaciją; tai gali būti $ suma, $min, Maks. $, arba $ vid.

$praleisti etapą

Galite naudoti $praleisti etapą praleisti nurodytą skaičių dokumentų išvestyje. Paprastai tai būna po grupės etapo. Pavyzdžiui, jei tikitės dviejų išvesties dokumentų, bet vieną praleisite, agregacija išves tik antrą dokumentą.

Norėdami pridėti praleidimo etapą, įdėkite $praleisti operacija į agregavimo vamzdyną:

...,
{
$skip: 1
},

$rūšiavimo etapas

Rūšiavimo etapas leidžia rūšiuoti duomenis mažėjančia arba didėjančia tvarka. Pavyzdžiui, galime toliau rūšiuoti ankstesnio užklausos pavyzdžio duomenis mažėjančia tvarka, kad nustatytume, kurios skilties pardavimai yra didžiausi.

Pridėkite $rūšiuoti operatorius į ankstesnę užklausą:

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

$ limito etapas

Ribojimo operacija padeda sumažinti išvesties dokumentų, kuriuos norite rodyti agregavimo dujotiekyje, skaičių. Pavyzdžiui, naudokite $ limitas operatorius, kad gautų sekciją su didžiausiu pardavimu ankstesniame etape:

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

{"$limit": 1}

Aukščiau pateikiamas tik pirmasis dokumentas; Tai yra daugiausiai pardavimų skyrius, kaip rodoma surūšiuotos produkcijos viršuje.

$projekto etapas

The $projektas etapas leidžia formuoti išvesties dokumentą taip, kaip jums patinka. Naudojant $projektas operatorių, galite nurodyti, kurį lauką įtraukti į išvestį, ir tinkinti jo rakto pavadinimą.

Pavyzdžiui, išvesties pavyzdys be $projektas scena atrodo taip:

Pažiūrėkime, kaip tai atrodo su $projektas etapas. Norėdami pridėti $projektas prie dujotiekio:

...,

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

}
}

Kadangi anksčiau duomenis sugrupavome pagal produktų skyrius, pirmiau pateikta informacija apima kiekvieną produkto skyrių išvesties dokumente. Tai taip pat užtikrina, kad išvestyje būtų rodomas bendras pardavimų skaičius ir didžiausias pardavimas TotalSold ir TopIšpardavimas.

Galutinis rezultatas yra daug švaresnis, palyginti su ankstesniu:

„$ atsipalaidavimo“ scena

The $atsipalaiduokite etapas suskaido masyvą dokumente į atskirus dokumentus. Imkitės šių dalykų Užsakymai duomenys, pavyzdžiui:

Naudoti $atsipalaiduokite etapas, skirtas dekonstruoti daiktų masyvą prieš taikydami kitus agregavimo etapus. Pavyzdžiui, išvyniojus daiktų masyvas yra prasmingas, jei norite apskaičiuoti visas kiekvieno produkto pajamas:

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

}
}
])

Štai aukščiau pateiktos apibendrinimo užklausos rezultatas:

Kaip sukurti agregavimo vamzdyną MongoDB

Nors apibendrinimo dujotiekis apima keletą operacijų, anksčiau pateikti etapai suteikia idėją, kaip jas taikyti konvejeryje, įskaitant pagrindinę kiekvienos užklausą.

Naudojant ankstesnį pardavimai duomenų pavyzdį, pateiksime kai kuriuos iš pirmiau aptartų etapų viename gabale, kad būtų platesnis agregavimo vamzdyno vaizdas:

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

}
}

])

Galutinis rezultatas atrodo kaip kažkas, ką matėte anksčiau:

Agregavimo vamzdynas vs. MapReduce

Iki jos naudojimo, pradedant nuo MongoDB 5.0, įprastas būdas kaupti duomenis MongoDB buvo naudojant MapReduce. Nors „MapReduce“ turi platesnes programas Be MongoDB, jis yra mažiau efektyvus nei agregavimo vamzdynas, todėl norint parašyti žemėlapį ir atskirai sumažinti funkcijas, reikia trečiosios šalies scenarijų.

Kita vertus, agregavimo vamzdynas yra būdingas tik MongoDB. Tačiau tai yra švaresnis ir efektyvesnis būdas atlikti sudėtingas užklausas. Be paprastumo ir užklausos mastelio, siūlomi konvejerio etapai leidžia geriau pritaikyti išvestį.

Yra daug daugiau skirtumai tarp agregavimo dujotiekio ir MapReduce. Juos matysite, kai pereisite iš MapReduce į agregavimo dujotiekį.

Padarykite didelių duomenų užklausas efektyvias MongoDB

Jūsų užklausa turi būti kuo efektyvesnė, jei norite atlikti išsamius sudėtingų duomenų skaičiavimus MongoDB. Sumavimo dujotiekis idealiai tinka išplėstinėms užklausoms. Užuot manipuliavus duomenimis atliekant atskiras operacijas, o tai dažnai sumažina našumą, sujungimas leidžia juos visus sudėti į vieną efektyvų konvejerį ir atlikti vieną kartą.

Nors agregavimo dujotiekis yra efektyvesnis nei MapReduce, indeksuodami duomenis galite greičiau ir efektyviau kaupti. Tai riboja duomenų, kuriuos MongoDB turi nuskaityti kiekviename agregavimo etape, kiekį.