Jest to nieco mylące, ponieważ nazwy są podobne, ale group()
polecenie jest inną funkcją i implementacją niż $group
operator potoku w ramach agregacji.
Polecenie group(), Framework agregacji i MapReduce są zbiorowo funkcjami agregacji MongoDB. Istnieje pewne nakładanie się funkcji, ale postaram się wyjaśnić różnice i ograniczenia każdej z nich w MongoDB 2.2.0.
Uwaga:wbudowane zestawy wyników wymienione poniżej odnoszą się do zapytań, które są przetwarzane w pamięci z wynikami zwracanymi na końcu wywołania funkcji. Alternatywne opcje wyjściowe (obecnie dostępne tylko w MapReduce) mogą obejmować zapisywanie wyników w nowej lub istniejącej kolekcji.
group()
Polecenie
-
Prosta składnia i funkcjonalność grupowania .. analogiczna do
GROUP BY
w SQL. -
Zwraca zestaw wyników w wierszu (jako tablicę zgrupowanych elementów).
-
Zaimplementowany przy użyciu silnika JavaScript; niestandardowe
reduce()
funkcje mogą być napisane w JavaScript. -
Aktualne ograniczenia
-
Nie grupuje się w zestaw wyników zawierający więcej niż 20 000 kluczy.
-
Wyniki muszą mieścić się w granicach dokumentu BSON (obecnie 16 MB).
-
Przyjmuje blokadę odczytu i nie pozwala innym wątkom na wykonywanie JavaScript podczas jego działania.
-
Nie działa z kolekcjami podzielonymi na fragmenty.
-
-
Zobacz też:przykłady poleceń group() .
MapReduce
-
Implementuje model MapReduce do przetwarzania dużych zbiorów danych.
-
Może wybrać jedną z kilku opcji wyjściowych (inline, nowa kolekcja, scalanie, zastępowanie, zmniejszanie)
-
Funkcje MapReduce są napisane w JavaScript.
-
Obsługuje kolekcje wejściowe nie podzielone na fragmenty i podzielone na fragmenty.
-
Może być używany do przyrostowej agregacji w dużych kolekcjach.
-
MongoDB 2.2 implementuje znacznie lepszą obsługę map sharded redukujących wydajność.
-
Aktualne ograniczenia
-
Pojedynczy emit może pomieścić tylko połowę maksymalnego rozmiaru dokumentu BSON MongoDB (16 MB).
-
Istnieje blokada JavaScript, więc serwer mongod może wykonać tylko jedną funkcję JavaScript w danym momencie .. jednak większość kroków MapReduce jest bardzo krótka, więc blokady mogą być często stosowane.
-
Funkcje MapReduce mogą być trudne do debugowania. Możesz użyć
print()
iprintjson()
aby uwzględnić dane diagnostyczne wmongod
dziennik. -
MapReduce generalnie nie jest intuicyjny dla programistów próbujących przetłumaczyć agregację zapytań relacyjnych.
-
-
Zobacz też:Przykłady map/redukcji .
Struktura agregacji
-
Nowa funkcja w wersji produkcyjnej MongoDB 2.2.0 (sierpień 2012).
-
Zaprojektowany z konkretnymi celami poprawy wydajności i użyteczności.
-
Zwraca zestaw wyników wbudowany.
-
Obsługuje kolekcje wejściowe nie podzielone na fragmenty i podzielone na fragmenty.
-
Wykorzystuje podejście „potokowe”, w którym obiekty są przekształcane, gdy przechodzą przez szereg operatorów potoku, takich jak dopasowywanie, rzutowanie, sortowanie i grupowanie.
-
Operatorzy potoku nie muszą tworzyć jednego dokumentu wyjściowego dla każdego dokumentu wejściowego:operatorzy mogą również generować nowe dokumenty lub odfiltrowywać dokumenty.
-
Korzystając z projekcji, możesz dodawać pola obliczeniowe, tworzyć nowe wirtualne podobiekty i wyodrębniać podpola do najwyższego poziomu wyników.
-
Operatory potoku można powtarzać w razie potrzeby (na przykład wiele
$project
lub$group
kroki. -
Aktualne ograniczenia
-
Wyniki są zwracane inline, więc są ograniczone do maksymalnego rozmiaru dokumentu obsługiwanego przez serwer (16 MB)
-
Nie obsługuje tylu opcji wyjściowych, co MapReduce
-
Ograniczone do operatorów i wyrażeń obsługiwanych przez ramy agregacji (tzn. nie można pisać funkcji niestandardowych)
-
Najnowsza funkcja serwera do agregacji, dzięki czemu ma więcej miejsca na dojrzewanie pod względem dokumentacji, zestawu funkcji i użytkowania.
-
-
Zobacz też:Przykłady struktury agregacji .
Czy ktoś może przedstawić ilustrację lub poprowadzić mnie do linku, w którym te trzy pojęcia są wyjaśnione razem, biorąc te same przykładowe dane, abym mógł je łatwo porównać?
Generalnie nie znajdziesz przykładów, w których przydatne byłoby porównanie wszystkich trzech podejść, ale oto poprzednie pytania StackOverflow, które pokazują różnice:
- group() a framework agregacji
- MapReduce a struktura agregacji