MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Porównanie agregacji MongoDB:group(), $group i MapReduce

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() i printjson() aby uwzględnić dane diagnostyczne w mongod 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



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. mongoengine - Zapytanie na ListField lub EmbeddedDocumentField

  2. Czym MongoDB różni się od bazy danych SQL

  3. Wybierz dane, w których zakres między dwoma różnymi polami zawiera podaną liczbę

  4. Co mam wybrać:MongoDB/Cassandra/Redis/CouchDB?

  5. Mongodb znajduje się wewnątrz tablicy podrzędnej