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:
- 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.
- Mogę mapować / redukować bezpośrednio do innej kolekcji, ale struktura agregacji może zwracać wyniki tylko w wierszu (myślę?)
- W przypadku aktualizacji przyrostowych, gdy więcej danych dociera do kolekcji źródłowej, mogę mapować / zmniejszać za pomocą
MapReduceCommand.OutputType
(w Javie) ustawione naREDUCE
, 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 № 1Ramy 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>" }
] )