MongoDB Map Reduce
Map-Reduce to model obliczeń, oznacza po prostu, że większość pracy (dane) rozkładu (MAP) do wykonania, a następnie scalić wyniki do wyniku końcowego (zmniejszenie).
MongoDB zapewnia Map-Reduce jest bardzo elastyczny do analizy danych na dużą skalę jest również bardzo praktyczne.
komenda MapReduce
Poniżej znajduje się podstawowa składnia MapReduce:
>db.collection.mapReduce( function() {emit(key,value);}, //map 函数 function(key,values) {return reduceFunction}, //reduce 函数 { out: collection, query: document, sort: document, limit: number } )
Korzystanie z funkcji mapreduce osiągnąć te dwie funkcje mapie i obniżenia funkcji, mapa wywołanie funkcji emitują (klucz, wartość), przemierzać kolekcję we wszystkich rejestrach, a wartość klucz jest przekazywany do funkcji Reduce celu przetworzenia.
Funkcja Map musi wywołać emitują (klucz, wartość) Zwraca par.
Parametr Opis:
- Funkcja mapowania (generowanie sekwencji klawiszy jak obniżyć parametryfunkcji): map.
- ograniczyć funkcje statystyczne, zadaniem jest zmniejszenie funkcję klucza i wartości na klucz-wartość, czyli tablicę wartości do wartości pojedynczej wartości.,
- z wyników statystycznych przechowywanych zestaw (nie przewidują wykorzystanie kolekcji tymczasowej automatycznie usuwane po klient jest odłączony).
- Warunkiem filtrkwerendy tylko spełniają warunki określone w dokumencie zostanie wywołana funkcja map.(Query.limit, sortowania można mieszać)
- sortowania i wiążące porządek sortowania parametrów (także byłym dokument wysłany do funkcji map do sortowania) Limit można zoptymalizować mechanizm grupowania
- ograniczyć liczbę dokumentów przesłanych do górnej granicy funkcji map (jeśli nie ma żadnych ograniczeń, sam rodzaj mało przydatne)
Korzystanie MapReduce
Rozważmy następującą strukturę dokumentu do przechowywania artykułów, dokumentów użytkownika i przechowuje pole stanu artykule nazwa_użytkownika użytkownika:
>db.posts.insert({ "post_text": "本教程,最全的技术文档。", "user_name": "mark", "status":"active" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "本教程,最全的技术文档。", "user_name": "mark", "status":"active" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "本教程,最全的技术文档。", "user_name": "mark", "status":"active" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "本教程,最全的技术文档。", "user_name": "mark", "status":"active" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "本教程,最全的技术文档。", "user_name": "mark", "status":"disabled" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "本教程,最全的技术文档。", "user_name": "w3big", "status":"disabled" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "本教程,最全的技术文档。", "user_name": "w3big", "status":"disabled" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "本教程,最全的技术文档。", "user_name": "w3big", "status":"active" }) WriteResult({ "nInserted" : 1 })
Teraz użyjemy stanowiska znajdujące Funkcja mapreduce wybrać opublikowany artykuł (status "aktywny"), oraz pakiet nazwa_użytkownika obliczane dla każdego użytkownika Posty:
>db.posts.mapReduce( function() { emit(this.user_name,1); }, function(key, values) {return Array.sum(values)}, { query:{status:"active"}, out:"post_total" } )
Przede mapreduce wyjście jest:
{ "result" : "post_total", "timeMillis" : 23, "counts" : { "input" : 5, "emit" : 5, "reduce" : 1, "output" : 2 }, "ok" : 1 }
Wyniki wykazały, że w sumie cztery dopasować kryteria zapytania (status: "aktywne") dokumenty generowane w czterech kluczowych funkcji mapy w dokumencie, a następnie wykorzystywać tę samą funkcję, aby zmniejszyć klucz podzielono na dwie grupy.
Określone parametry:
- Wynik: przechowywać wyniki nazwy kolekcji, ten jest tymczasowy zestaw wycofać automatycznego podłączenia MapReduce został usunięty.
- timeMillis: realizacja wymaga czasu w milisekundach
- Wejście: ilość stan dokumentu jest wysyłane do funkcji map
- emitują: razy w funkcji map emitują nazywa, czyli łączną kwotę wszystkich gromadzenia danych
- Ouput: Wyniki Ilość dokumentów w kolekcji (liczba jest bardzo pomocne dla debugowania)
- ok: sukces, sukces 1
- ERR: Jeśli to się nie powiedzie, nie może być powodem, by upaść, ale z doświadczenia wynika, że powodem jest niejasne, nie bardzo użyteczne
Korzystanie z operatorem find, aby zobaczyć wyniki zapytania mapreduce z:
>db.posts.mapReduce( function() { emit(this.user_name,1); }, function(key, values) {return Array.sum(values)}, { query:{status:"active"}, out:"post_total" } ).find()
Wyniki powyższego zapytania jest pokazany poniżej, istnieją dwa użytkowników tom i zaznaczyć dwa artykuły opublikowane:
{ "_id" : "mark", "value" : 4 } { "_id" : "w3big", "value" : 1 }
W podobny sposób, MapReduce mogą być stosowane do tworzenia dużych, zagregowanych złożonych zapytań.
Funkcje Funkcja Map i zmniejszenia mogą być realizowane z wykorzystaniem JavaScript, MapReduce skorzystać z bardzo elastyczny i potężny.