Podczas nauki mogłeś przegapić główną stronę podręcznika na mapReduce . Jest jeden istotny element informacji, które przegapiłeś lub których nie przeczytałeś i których nie poznałeś:
A potem trochę później:
Zasadniczo oznacza to, że ponieważ „reduktor” w rzeczywistości nie przetwarza „wszystkich” unikalnych kluczy naraz, oczekuje tego samego „wejścia”, co daje „wyjście”, ponieważ dane wyjściowe można ponownie reduktor.
Z tego samego powodu „mapper” musi wyprowadzać dokładnie to, czego oczekuje się od wyjścia „reduktora”, które jest również „wejściem” reduktora. Tak więc nie zmieniasz w ogóle struktury danych, ale po prostu ją „zmniejszasz”.
db.Cool.mapReduce(
function(){emit(this.id, { "cools": [this.cool] })},
function(key, values){
var res = [];
values.forEach(function(cool){
cool.cools.forEach(function(v) {
res.push(v);
});
});
return {cools: res};
},
{out: "MapReduce"}
)
Teraz traktujesz dane wejściowe jako tablicę, która jest również danymi wyjściowymi, a następnie zwracane są oczekiwane wyniki.
Następną rzeczą, której należy się nauczyć, jest to, że w większości przypadki mapReduce nie jest tak naprawdę tym, czego chcesz użyć, i powinieneś używać struktura agregacji zamiast tego.
W przeciwieństwie do mapReduce, ten używa "kodowanych natywnie" operatorów i nie wymaga interpretacji JavaScript do uruchomienia. A to w dużej mierze oznacza, że jest „szybszy” i często o wiele prostszy w budowie.
Oto ta sama operacja z .aggregate()
:
db.Cool.aggregate([
{ "$group": {
"_id": "$id",
"cools": { "$push": "$cool" }
}}
])
To samo, mniej kodowania i dużo szybciej.
Wysyłając do innej kolekcji używasz $out
:
db.Cool.aggregate([
{ "$group": {
"_id": "$id",
"cools": { "$push": "$cool" }
}},
{ "$out": "reduced" }
])
Dla przypomnienia, oto dane wyjściowe mapReduce:
{ "_id" : "a", "value" : { "cools" : [ "a1", "a2" ] } }
{ "_id" : "b", "value" : { "cools" : [ "b1", "b2" ] } }
{ "_id" : "c", "value" : { "cools" : [ "c1" ] } }
{ "_id" : "d", "value" : { "cools" : [ "d1" ] } }
I zagregowana produkcja. Z jedyną różnicą w stosunku do mapReduce _id
i value
obowiązkowym wyjściem jest to, że klucze są odwrócone, ponieważ $group
nie gwarantuje kolejności (ale jest zwykle obserwowany jako odwrócony stos):
{ "_id" : "d", "cools" : [ "d1" ] }
{ "_id" : "c", "cools" : [ "c1" ] }
{ "_id" : "b", "cools" : [ "b1", "b2" ] }
{ "_id" : "a", "cools" : [ "a1", "a2" ] }