2015-05-22 8 views
8

Patrząc na documentation na mapie, zmniejszyć, stwierdziliśmy, że:Kiedy użyć mapy, aby zmniejszyć nad Aggregation Pipeline w MongoDB?

UWAGA:

Dla większości operacji agregacji, agregację Pipeline zapewnia lepsze osiągi i bardziej spójny interfejs. Jednak operacje polegające na zmniejszeniu liczby map zapewniają pewną elastyczność, która nie jest obecnie dostępna w potoku agregacji.

Nie zrozumiałem zbyt wiele z tego.

  • Jakie są przypadki użycia przy korzystaniu z funkcji map-reduce over aggregation?
  • Jaką elastyczność zapewnia mapa-redukcja?
  • Jaka jest różnica w wydajności?

Odpowiedz

12

Po pierwsze, Map/Reduce w MongoDB nie został stworzony dla zapytań ad-hoc, istnieje znaczne obciążenie dla M/R. Nawet bardzo prosta operacja M/R na małym zestawie danych może zająć setki milisekund z powodu tego nadmiaru.

Nie mogę wiele powiedzieć o wydajności M/R w porównaniu do struktury agregacji na dużych zestawach danych w praktyce, ale teoretycznie operacje M/R na dużej bazie danych z sharded powinny być szybsze, ponieważ odłamki mogą działać operacje w dużej mierze równolegle.

Jeśli chodzi o elastyczność, ponieważ M/R faktycznie obsługuje metody javascript, masz pełną moc języka do swojej dyspozycji. Na przykład, powiedzmy, że chcesz zgrupować dane przez cosinus wartości pola. Ponieważ w strukturze agregacji nie ma ani operatora $cos, ani znaczącego sposobu budowania oddzielnych segmentów z liczb ciągłych (podobnie jak w przypadku $truncate), struktura agregacji nie pomogłaby w takim przypadku.

Tak, w skrócie, powiedziałbym, że przypadki użycia są

  • utrzymaniem wyników M/R w selektywnej zbiórki i aktualizowanie go od czasu do czasu (przy użyciu parametru out i scalanie wyników)
  • Złożone zapytania dotyczące dużych, zaszyfrowanych zestawów danych
  • Zapytania, które są tak skomplikowane, że nie można użyć struktury agregacji. Powiedziałbym, że jest to całkiem pewna oznaka defektu konstrukcyjnego w strukturze danych, ale w zasadzie może pomóc