/ / MongoDB - agregujesz do innej kolekcji? - mongodb, mapreduce, agregacja-framework

MongoDB - zagreguj do innej kolekcji? - mongodb, mapreduce, framework agregacji

Mam proces, którego obecnie używam MongoMapa / Reduce frameworka, ale nie działa zbyt dobrze. Jest to dość prosta agregacja, w której dzielę na trzy pola, zwracając sumę 4 różnych pól i przechodząc przez wartości dla kolejnych 4 pól (które są stałe w każdym wiadrze).

Z powodów opisanych w [ Zmniejsz wydajność mapy w MongoDb 2.2, 2.4 i 2.6 ], Chciałbym przekonwertować to na platformę agregacji w celu uzyskania lepszej wydajności, ale myślę, że stoją mi na drodze 3 rzeczy:

  1. Całkowity wynik może być duży, przekraczając limit 16 MB Mongo, nawet jeśli wynik w jednym dokumencie jest bardzo mały.
  2. Mogę mapować / redukować bezpośrednio do innej kolekcji, ale struktura agregacji może zwracać wyniki tylko w wierszu (myślę?)
  3. W przypadku aktualizacji przyrostowych, gdy więcej danych dociera do kolekcji źródłowej, mogę mapować / zmniejszać za pomocą MapReduceCommand.OutputType (w Javie) ustawione na REDUCE, dokładnie pasuje do mojego przypadku użycia, ale nie widzę odpowiedniej funkcjonalności w strukturze agregacji.

Czy istnieją dobre sposoby ich rozwiązania w ramach agregacji? Serwer ma teraz wersję 2.4.3 - prawdopodobnie możemy zaktualizować w razie potrzeby, jeśli pojawią się nowe możliwości.

Odpowiedzi:

1 dla odpowiedzi № 1

Ramy agregacji nie można obecnie wysłać bezpośrednio do innej kolekcji. Możesz jednak spróbować odpowiedzieć w tej dyskusji: Zagregowane wyniki SO-pytania do nowej kolekcji Redukcja map jest o wiele wolniejsza i ja teżczekam na rozwiązanie. Możesz wypróbować złącze Hadoop do Mongodb, które jest obsługiwane na stronie internetowej mongodb. Hadoop jest szybszy przy zmniejszaniu map. Ale nie wiem, czy dobrze by to pasowało w twoim konkretnym przypadku.

Link do złącza Hadoop + MongoDB

Wszystkiego najlepszego.


3 dla odpowiedzi № 2

Możesz to zrobić teraz $ out jak wyjaśniono w mongo

$ out Pobiera dokumenty zwrócone przezpotok agregacji i zapisuje je do określonej kolekcji. Operator $ out pozwala ramom agregacji zwrócić zestawy wyników o dowolnym rozmiarze. Operator $ out musi być ostatnim etapem w przygotowaniu.

Polecenie ma następującą składnię, gdzie jest zbiorem, który przechowa dane wyjściowe operacji agregacji. $ out jest dopuszczalne tylko na końcu rurociągu:

db.<collection>.aggregate( [
{ <operation> },
{ <operation> },
...,
{ $out : "<output-collection>" }
] )