Je to poněkud matoucí, protože názvy jsou podobné, ale group()
příkaz je odlišná funkce a implementace od $group
operátor potrubí v agregačním rámci.
Příkaz group(), Aggregation Framework a MapReduce jsou společně funkce agregace z MongoDB. Funkce se do jisté míry překrývají, ale pokusím se vysvětlit rozdíly a omezení každého z nich jako v MongoDB 2.2.0.
Poznámka:vložené sady výsledků níže uvedené se týkají dotazů, které jsou zpracovány v paměti s výsledky vrácenými na konci volání funkce. Alternativní možnosti výstupu (aktuálně dostupné pouze s MapReduce) mohou zahrnovat ukládání výsledků do nové nebo existující kolekce.
group()
Příkaz
-
Jednoduchá syntaxe a funkčnost pro seskupování .. analogická k
GROUP BY
v SQL. -
Vrátí sadu výsledků inline (jako pole seskupených položek).
-
Implementováno pomocí enginu JavaScript; vlastní
reduce()
funkce lze psát v JavaScriptu. -
Aktuální omezení
-
Nebude seskupovat do sady výsledků s více než 20 000 klíči.
-
Výsledky musí odpovídat omezením dokumentu BSON (aktuálně 16 MB).
-
Vezme zámek čtení a nedovolí jiným vláknům spouštět JavaScript, když je spuštěný.
-
Nefunguje se sdílenými kolekcemi.
-
-
Viz také:příklady příkazů group() .
MapReduce
-
Implementuje model MapReduce pro zpracování velkých souborů dat.
-
Může si vybrat jednu z několika možností výstupu (inline, nová kolekce, sloučení, nahrazení, zmenšení)
-
Funkce MapReduce jsou napsány v JavaScriptu.
-
Podporuje nesdílené a sdílené kolekce vstupů.
-
Lze použít pro přírůstkovou agregaci nad velkými kolekcemi.
-
MongoDB 2.2 implementuje mnohem lepší podporu pro redukci výstupu dělených map.
-
Aktuální omezení
-
Jeden emit může pojmout pouze polovinu maximální velikosti BSON dokumentu MongoDB (16 MB).
-
Existuje zámek JavaScriptu, takže server mongod může v určitém okamžiku spustit pouze jednu funkci JavaScriptu. Většina kroků MapReduce je však velmi krátká, takže zámky lze často uvolňovat.
-
Funkce MapReduce může být obtížné ladit. Můžete použít
print()
aprintjson()
zahrnout diagnostický výstup domongod
log. -
MapReduce obecně není intuitivní pro programátory, kteří se snaží překládat zkušenosti s agregací relačních dotazů.
-
-
Viz také:Příklady mapování/zmenšení .
Agregační rámec
-
Nová funkce v produkčním vydání MongoDB 2.2.0 (srpen 2012).
-
Navrženo se specifickými cíli zlepšení výkonu a použitelnosti.
-
Vrátí sadu výsledků inline.
-
Podporuje nesdílené a sdílené kolekce vstupů.
-
Používá „potrubní“ přístup, kdy se objekty transformují, když procházejí řadou operátorů potrubí, jako je párování, promítání, řazení a seskupování.
-
Operátoři kanálu nemusejí vytvářet jeden výstupní dokument pro každý vstupní dokument:operátoři mohou také generovat nové dokumenty nebo dokumenty filtrovat.
-
Pomocí projekcí můžete přidávat vypočítaná pole, vytvářet nové virtuální dílčí objekty a extrahovat podpole do nejvyšší úrovně výsledků.
-
Operátory potrubí lze podle potřeby opakovat (například více
$project
nebo$group
kroky. -
Aktuální omezení
-
Výsledky jsou vráceny inline, takže jsou omezeny na maximální velikost dokumentu podporovanou serverem (16 MB)
-
Nepodporuje tolik možností výstupu jako MapReduce
-
Omezeno na operátory a výrazy podporované agregačním rámcem (tj. nelze zapisovat vlastní funkce)
-
Nejnovější funkce serveru pro agregaci, takže má více prostoru pro zrání, pokud jde o dokumentaci, sadu funkcí a použití.
-
-
Viz také:Příklady agregačního rámce .
Může mi někdo předložit ilustraci nebo mě navést na odkaz, kde jsou tyto tři pojmy vysvětleny společně, přičemž se použijí stejná vzorová data, abych je mohl snadno porovnat?
Obecně nenajdete příklady, kde by bylo užitečné porovnat všechny tři přístupy, ale zde jsou předchozí otázky StackOverflow, které ukazují varianty:
- group() versus agregační rámec
- MapReduce versus agregační rámec