Ak ste si vybrali MapReduce, teraz by mohol byť čas prejsť na agregačný kanál MongoDB na riešenie zložitých operácií.

Agregačný kanál je odporúčaný spôsob spúšťania zložitých dotazov v MongoDB. Ak ste používali MapReduce od MongoDB, radšej prepnite na agregačný kanál pre efektívnejšie výpočty.

Čo je agregácia v MongoDB a ako to funguje?

Agregačný kanál je viacstupňový proces pre pokročilé dotazy v MongoDB. Spracováva údaje prostredníctvom rôznych etáp nazývaných pipeline. Výsledky vygenerované z jednej úrovne môžete použiť ako šablónu operácie v inej.

Môžete napríklad odovzdať výsledok operácie zhody do inej fázy na triedenie v tomto poradí, kým nezískate požadovaný výstup.

Každá fáza agregačného kanála obsahuje operátora MongoDB a generuje jeden alebo viac transformovaných dokumentov. V závislosti od vášho dopytu sa úroveň môže v kanáli objaviť viackrát. Možno budete musieť použiť napríklad $počet alebo $triediť operátor viac ako raz v rámci agregačného kanála.

Etapy agregačného potrubia

Agregačný kanál prechádza údaje cez viacero fáz v jednom dotaze. Existuje niekoľko fáz a ich podrobnosti nájdete v časti MongoDB dokumentácia.

Nižšie definujme niektoré z najčastejšie používaných.

$match Stage

Táto fáza vám pomáha definovať špecifické podmienky filtrovania pred spustením ostatných fáz agregácie. Môžete ho použiť na výber zodpovedajúcich údajov, ktoré chcete zahrnúť do agregačného kanála.

$group Stage

Skupinová fáza rozdeľuje údaje do rôznych skupín na základe špecifických kritérií pomocou párov kľúč – hodnota. Každá skupina predstavuje kľúč vo výstupnom dokumente.

Zvážte napríklad nasledujúce predaja vzorové údaje:

Pomocou agregačného kanála môžete vypočítať celkový počet predajov a najvyššie predaje pre každú sekciu produktu:

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

The _id: $Section pár zoskupuje výstupný dokument na základe sekcií. Zadaním top_sales_count a top_sales polia, MongoDB vytvorí nové kľúče na základe operácie definovanej agregátorom; toto môže byť $sum, $ min, max, alebo $ avg.

$skip Stage

Môžete použiť $preskočiť etape, aby sa vo výstupe vynechal zadaný počet dokumentov. Zvyčajne prichádza po skupinovej fáze. Ak napríklad očakávate dva výstupné dokumenty, ale jeden preskočíte, agregácia vytlačí iba druhý dokument.

Ak chcete pridať fázu preskočenia, vložte $preskočiť operácia do agregačného potrubia:

...,
{
$skip: 1
},

$sort Stage

Fáza triedenia vám umožňuje usporiadať údaje v zostupnom alebo vzostupnom poradí. Napríklad môžeme ďalej zoradiť údaje v predchádzajúcom príklade dopytu v zostupnom poradí, aby sme určili, ktorá sekcia má najvyšší predaj.

Pridajte $triediť operátor na predchádzajúci dotaz:

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

$limit Stage

Operácia limitu pomáha znížiť počet výstupných dokumentov, ktoré má agregačný kanál zobrazovať. Napríklad použite $limit operátorovi, aby sa sekcia s najvyšším obratom vrátila v predchádzajúcej fáze:

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

{"$limit": 1}

Vyššie uvedené vráti iba prvý dokument; toto je sekcia s najvyšším predajom, ako sa zobrazuje v hornej časti triedeného výstupu.

$projektová fáza

The $projekt stage vám umožňuje tvarovať výstupný dokument tak, ako chcete. Pomocou $projekt môžete určiť, ktoré pole sa má zahrnúť do výstupu a prispôsobiť jeho názov kľúča.

Napríklad vzorový výstup bez $projekt etapa vyzerá takto:

Pozrime sa, ako to vyzerá s $projekt etapa. Ak chcete pridať $projekt do potrubia:

...,

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

}
}

Keďže sme predtým zoskupovali údaje podľa sekcií produktu, vyššie uvedené zahŕňa každú sekciu produktu vo výstupnom dokumente. Zabezpečuje tiež, že počet agregovaných predajov a najvyššie predaje sú súčasťou výstupu ako TotalSold a TopSale.

Konečný výstup je oveľa čistejší v porovnaní s predchádzajúcim:

$unwind Fáza

The $uvoľnite sa stage rozdelí pole v rámci dokumentu na jednotlivé dokumenty. Vezmite nasledovné objednávky údaje, napríklad:

Použi $uvoľnite sa štádium na dekonštrukciu položky pred aplikáciou ďalších štádií agregácie. Napríklad odvíjanie položky pole dáva zmysel, ak chcete vypočítať celkový príjem pre každý 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",

}
}
])

Tu je výsledok vyššie uvedeného agregačného dotazu:

Ako vytvoriť agregačný kanál v MongoDB

Zatiaľ čo agregačný kanál zahŕňa niekoľko operácií, predchádzajúce uvedené fázy vám poskytujú predstavu o tom, ako ich použiť v potrubí, vrátane základného dotazu pre každú z nich.

Pomocou predchádzajúceho predaja vzorka údajov, zoberme si niektoré z vyššie uvedených etáp v jednom kuse, aby sme získali širší pohľad na agregačný kanál:

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

}
}

])

Konečný výstup vyzerá ako niečo, čo ste už videli:

Agregačný kanál vs. MapReduce

Až do ukončenia podpory od MongoDB 5.0 bol konvenčným spôsobom agregovania údajov v MongoDB cez MapReduce. Hoci MapReduce má širšie využitie mimo MongoDB je to menej efektívne ako agregačný kanál, ktorý vyžaduje skriptovanie tretích strán na samostatné písanie mapy a redukciu funkcií.

Na druhej strane agregačný kanál je špecifický iba pre MongoDB. Poskytuje však čistejší a efektívnejší spôsob vykonávania zložitých dotazov. Okrem jednoduchosti a škálovateľnosti dotazov umožňujú jednotlivé fázy kanála výstup lepšie prispôsobiť.

Je ich oveľa viac rozdiely medzi agregačným potrubím a MapReduce. Uvidíte ich, keď prejdete z MapReduce na agregačný kanál.

Efektívne dopytovanie veľkých dát v MongoDB

Váš dotaz musí byť čo najefektívnejší, ak chcete spustiť hĺbkové výpočty na komplexných údajoch v MongoDB. Agregačný kanál je ideálny pre pokročilé dopytovanie. Namiesto manipulácie s údajmi v samostatných operáciách, ktoré často znižujú výkon, vám agregácia umožňuje zbaliť ich všetky do jedného výkonného potrubia a spustiť ich raz.

Aj keď je agregačný kanál efektívnejší ako MapReduce, agregáciu môžete zrýchliť a zefektívniť indexovaním údajov. Toto obmedzuje množstvo údajov, ktoré MongoDB potrebuje naskenovať počas každej fázy agregácie.