Latest web development tutorials

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.