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.