Pokud byl MapReduce vaším cílem, nyní by mohl být čas přejít na agregační kanál MongoDB pro řešení složitých operací.
Agregační kanál je doporučený způsob spouštění složitých dotazů v MongoDB. Pokud jste používali MapReduce od MongoDB, raději přepněte na agregační kanál pro efektivnější výpočty.
Co je agregace v MongoDB a jak to funguje?
Agregační kanál je vícestupňový proces pro pokročilé spuštění dotazy v MongoDB. Zpracovává data prostřednictvím různých fází nazývaných potrubí. Výsledky vygenerované z jedné úrovně můžete použít jako šablonu operace v jiné.
Můžete například předat výsledek operace shody do jiné fáze pro třídění v tomto pořadí, dokud nezískáte požadovaný výstup.
Každá fáze agregačního kanálu obsahuje operátora MongoDB a generuje jeden nebo více transformovaných dokumentů. V závislosti na vašem dotazu se úroveň může objevit vícekrát v kanálu. Možná budete muset použít například $počet nebo $sort operátor provádí v agregačním kanálu více než jednou.
Fáze agregačního potrubí
Agregační kanál předává data několika fázemi v jediném dotazu. Existuje několik fází a jejich podrobnosti najdete v MongoDB dokumentace.
Níže definujeme některé z nejčastěji používaných.
$match Stage
Tato fáze vám pomůže definovat konkrétní podmínky filtrování před zahájením dalších fází agregace. Můžete jej použít k výběru odpovídajících dat, která chcete zahrnout do agregačního kanálu.
$group Stage
Fáze skupiny rozděluje data do různých skupin na základě specifických kritérií pomocí párů klíč–hodnota. Každá skupina představuje klíč ve výstupním dokumentu.
Zvažte například následující odbyt vzorek dat:
Pomocí agregačního kanálu můžete vypočítat celkový počet prodejů a nejvyšší prodeje pro každou sekci produktu:
{
$group: {
_id: $Section,
total_sales_count: {$sum: $Sold},
top_sales: {$max: $Amount},
}
}
The _id: $Section pár seskupuje výstupní dokument na základě sekcí. Zadáním top_sales_count a top_sales pole, MongoDB vytvoří nové klíče na základě operace definované agregátorem; to může být $sum, $ min, max. $nebo $prům.
$skip Stage
Můžete použít $přeskočit fázi vynechat zadaný počet dokumentů ve výstupu. Obvykle to přichází po skupinové fázi. Pokud například očekáváte dva výstupní dokumenty, ale jeden vynecháte, agregace vytiskne pouze druhý dokument.
Chcete-li přidat fázi přeskočení, vložte $přeskočit operace do agregačního potrubí:
...,
{
$skip: 1
},
Fáze $sort
Fáze řazení vám umožňuje uspořádat data v sestupném nebo vzestupném pořadí. Například můžeme dále seřadit data v předchozím příkladu dotazu v sestupném pořadí, abychom určili, která sekce má nejvyšší prodeje.
Přidat $sort operátor na předchozí dotaz:
...,
{
$sort: {top_sales: -1}
},
$limit Stage
Operace omezení pomáhá snížit počet výstupních dokumentů, které má agregační kanál zobrazovat. Použijte například $limit operátor získat sekci s nejvyššími tržbami vrácenou předchozí fází:
...,
{
$sort: {top_sales: -1}
},
{"$limit": 1}
Výše uvedené vrátí pouze první dokument; toto je sekce s nejvyšším prodejem, jak se objevuje v horní části seřazeného výstupu.
$projektová fáze
The $projekt stage umožňuje tvarovat výstupní dokument tak, jak chcete. Za použití $projekt můžete určit, které pole má být zahrnuto do výstupu, a přizpůsobit jeho název klíče.
Například ukázkový výstup bez $projekt etapa vypadá takto:
Podívejme se, jak to vypadá s $projekt etapa. Chcete-li přidat $projekt do potrubí:
...,{
"$project": {
"_id": 0,
"Section": "$_id",
"TotalSold": "$total_sales_count",
"TopSale": "$top_sales",
}
}
Protože jsme dříve seskupovali data podle sekcí produktu, výše uvedené zahrnuje každou sekci produktu ve výstupním dokumentu. Zajišťuje také, že agregovaný počet prodejů a nejvyšší prodeje jsou součástí výstupu jako Celkem prodáno a TopSale.
Konečný výstup je mnohem čistší ve srovnání s předchozím:
Fáze $unwind
The $uvolněte se stage rozloží pole v dokumentu na jednotlivé dokumenty. Vezměte si následující Objednávky údaje, například:
Použijte $uvolněte se fázi dekonstruovat položky pole před aplikací dalších fází agregace. Například odvíjení položky pole má smysl, pokud chcete vypočítat celkový příjem pro 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",
}
}
])
Zde je výsledek výše uvedeného agregačního dotazu:
Jak vytvořit agregační kanál v MongoDB
Zatímco kanál agregace zahrnuje několik operací, dříve uvedené fáze vám poskytnou představu o tom, jak je použít v kanálu, včetně základního dotazu pro každou z nich.
Pomocí předchozího odbyt datový vzorek, pojďme mít některé z výše diskutovaných fází v jednom kuse pro širší pohled 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 vypadá jako něco, co jste viděli dříve:
Agregační kanál vs. MapReduce
Až do ukončení podpory od MongoDB 5.0 byl konvenčním způsobem agregace dat v MongoDB přes MapReduce. Ačkoli MapReduce má širší uplatnění mimo MongoDB je méně efektivní než agregační kanál, který vyžaduje skriptování třetích stran k samostatnému psaní mapy a redukci funkcí.
Na druhé straně agregační kanál je specifický pouze pro MongoDB. Poskytuje však čistší a efektivnější způsob provádění složitých dotazů. Kromě jednoduchosti a škálovatelnosti dotazů umožňují jednotlivé fáze kanálu výstup lépe přizpůsobit.
Je jich mnohem víc rozdíly mezi agregačním kanálem a MapReduce. Uvidíte je, když přepnete z MapReduce na agregační kanál.
Zefektivněte dotazy na velká data v MongoDB
Pokud chcete provádět hloubkové výpočty na komplexních datech v MongoDB, musí být váš dotaz co nejefektivnější. Agregační kanál je ideální pro pokročilé dotazování. Namísto manipulace s daty v samostatných operacích, které často snižují výkon, vám agregace umožňuje sbalit je všechna do jednoho výkonného kanálu a provést je jednou.
Zatímco agregační kanál je efektivnější než MapReduce, můžete agregaci zrychlit a zefektivnit indexováním dat. To omezuje množství dat, které MongoDB potřebuje ke skenování během každé fáze agregace.