2011-12-07 9 views
6

Kiedy biegnę Map-Reduce na bazie Mongo, zwykle uzyskać wyniki podobne do poniższego:Jak zmienić strukturę mapy MongoDB - zmniejszyć wyniki?

{ _id: <some-id>, value: { <first-key>: <first-value>, ... } } 

Czy istnieje sposób aby pominąć value: { ... } część i jest bezpośrednio wstawić treść value w wyniku ? Zasadniczo chciałbym mieć wynik, który wygląda następująco:

{ _id: <some-id>, <first-key>: <first-value>, ... } 

W ten sposób mogę scalić wyników z powrotem do istniejącego zbioru że przestrzega tego formatu.

Mam również inne pytanie dotyczące Map-Reduce: Czy można uzyskać dostęp do innej kolekcji z funkcją map lub reduce?

+0

możliwy duplikat [W MongoDB mapreduce, w jaki sposób mogę spłaszczyć obiekt wartości?] (Http://stackoverflow.com/questions/7257989/in-mongodb-mapreduce-how-can-i-flatten-the-values -obiekt) –

Odpowiedz

6

MapReduce zwraca tylko dokumenty postaci {_id: some_id, wartość: some_value}

„some_value” niekoniecznie musi być osadzony dokument, ale w większości przypadków polega na umożliwieniu obliczania wielu zmiennych przez funkcję Map Reduce. Dokumenty zwrócone przez funkcję Reduce muszą być w tej samej formie, w jakiej zostały wprowadzone, ponieważ funkcja Reduce może być wielokrotnie uruchamiana dla dowolnej wartości _id.

Dla krok po kroku, w jaki sposób mapa Zmniejszyć prace można znaleźć w sekcji „Dodatki” receptury MongoDB Cookbook zatytułowanej „Znajdowanie min, max wartości z numerów wersji Dokumentów” http://cookbook.mongodb.org/patterns/finding_max_and_min/ Powinno to zapewnić lepsze zrozumienie, w jaki sposób mapa Zmniejsz liczbę prac i dlaczego dane wyjściowe muszą mieć format {_id: some_id, value: some_value}

Można wykonać przyrostową redukcję mapy, która połączy wyniki wielu funkcji redukcji mapy. http://www.mongodb.org/display/DOCS/MapReduce#MapReduce-IncrementalMapreduce

Wreszcie, obecnie nie jest możliwe uzyskanie dostępu do wielu kolekcji jednocześnie dzięki funkcji Map Reduce. Istnieje żądanie funkcji dla tej możliwości, ale nie jest ono planowane do dodania do żadnej nadchodzącej wersji.
https://jira.mongodb.org/browse/SERVER-970

0

Ten pracował dla mnie:
Zakładając, że emitują this lub odmianą w nim mapy, najpierw ustawić this._id = undefined.
Tryb ustawień do scalenia.

Sprawdź mój przykład here

0

RE: Dostęp do innych kolekcji z poziomu Map/Reduce functions. Jedyne, co możesz zrobić, to wykorzystać "zakres" do przesyłania danych wymaganych przez m/r podczas wykonywania. UWAGA: zasięg przyjmuje tutaj tylko kolekcję obiektów SIMPLE. Przez proste mam na myśli brak zagnieżdżonych dokumentów.

scope = { People : [{ Name : 'bob', Color : 'blue'}, { Name : 'sally', Color: 'orange'}] } 

Powyższy zestaw narzędzi działa dobrze. W nocy funkcja/r tylko odnieść się do „People” jako zmienną globalną i można iterację kolekcji itp

scope = { People : [{ Name : 'bob', Color : { Favorite : 'blue'} }, { Name : 'sally', Color : { Favorite : 'orange' } }] } 

Powyższe nie będzie działać, w zależności od kierowcy używasz dostaniesz a Range Error i powiedział, że maksymalny rozmiar połączenia został przekroczony lub coś w tym stylu. Trzymanie się prostych obiektów w zasięgu pozwoli utrzymać proste życie.

Powiązane problemy