MongoDB - Zmniejsz mapę

Zgodnie z dokumentacją MongoDB, Map-reduceto paradygmat przetwarzania danych polegający na kondensowaniu dużych ilości danych w użyteczne zagregowane wyniki. MongoDB używamapReducepolecenie dla operacji zmniejszania mapy. MapReduce jest zwykle używane do przetwarzania dużych zestawów danych.

MapReduce Command

Poniżej znajduje się składnia podstawowego polecenia mapReduce -

>db.collection.mapReduce(
   function() {emit(key,value);},  //map function
   function(key,values) {return reduceFunction}, {   //reduce function
      out: collection,
      query: document,
      sort: document,
      limit: number
   }
)

Funkcja map-redukuj najpierw wysyła zapytanie do kolekcji, a następnie mapuje dokumenty wynikowe w celu emisji par klucz-wartość, które są następnie redukowane na podstawie kluczy, które mają wiele wartości.

W powyższej składni -

  • map to funkcja javascript, która mapuje wartość za pomocą klucza i emituje parę klucz-wartość

  • reduce to funkcja javascript, która redukuje lub grupuje wszystkie dokumenty mające ten sam klucz

  • out określa lokalizację wyniku zapytania zmniejszającego mapę

  • query określa opcjonalne kryteria wyboru dokumentów

  • sort określa opcjonalne kryteria sortowania

  • limit określa opcjonalną maksymalną liczbę dokumentów do zwrotu

Korzystanie z MapReduce

Rozważ następującą strukturę dokumentu przechowującą posty użytkowników. Dokument przechowuje nazwę_użytkownika użytkownika i status wiadomości.

{
   "post_text": "tutorialspoint is an awesome website for tutorials",
   "user_name": "mark",
   "status":"active"
}

Teraz użyjemy funkcji mapReduce na naszym posts kolekcji, aby wybrać wszystkie aktywne posty, pogrupować je według nazwy użytkownika, a następnie policzyć liczbę postów każdego użytkownika za pomocą następującego kodu -

>db.posts.mapReduce( 
   function() { emit(this.user_id,1); }, 
	
   function(key, values) {return Array.sum(values)}, {  
      query:{status:"active"},  
      out:"post_total" 
   }
)

Powyższe zapytanie mapReduce zwraca następujący wynik -

{
   "result" : "post_total",
   "timeMillis" : 9,
   "counts" : {
      "input" : 4,
      "emit" : 4,
      "reduce" : 2,
      "output" : 2
   },
   "ok" : 1,
}

Wynik pokazuje, że łącznie 4 dokumenty pasowały do ​​zapytania (stan: „aktywny”), funkcja mapowania wyemitowała 4 dokumenty z parami klucz-wartość, a na końcu funkcja redukcji zgrupowała zmapowane dokumenty mające te same klucze na 2.

Aby zobaczyć wynik tego zapytania mapReduce, użyj operatora wyszukiwania -

>db.posts.mapReduce( 
   function() { emit(this.user_id,1); }, 
   function(key, values) {return Array.sum(values)}, {  
      query:{status:"active"},  
      out:"post_total" 
   }
	
).find()

Powyższe zapytanie daje następujący wynik, który wskazuje, że obaj użytkownicy tom i mark mieć dwa posty w aktywnych stanach -

{ "_id" : "tom", "value" : 2 }
{ "_id" : "mark", "value" : 2 }

W podobny sposób zapytania MapReduce mogą służyć do konstruowania dużych złożonych zapytań agregujących. Korzystanie z niestandardowych funkcji JavaScript korzysta z MapReduce, które jest bardzo elastyczne i wydajne.