При обучението си може да сте пропуснали основната страница с ръководство на mapReduce . Има едно жизненоважно парче информация, която сте пропуснали или не сте прочели и научили:
И след това малко след това:
Това, което всъщност означава, е, че тъй като "редуцентът" всъщност не обработва "всички" уникални ключове наведнъж, тогава той очаква същия "вход", както дава "изход", тъй като този изход може да бъде върнат обратно в отново редуктора.
По същата причина "mapper" трябва да изведе точно това, което се очаква като изход на "редуцент", който също е "вход" на редуктора. Така че всъщност изобщо не "променяте" структурата на данните, а просто я "намалявате".
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"}
)
Сега вие обработвате входа като масив, който също е изход, след което се връщат очакваните резултати.
Следващото нещо, което трябва да научите е, че вповечето случаи mapReduce всъщност не е това, което искате да използвате и че трябва да използвате рамка за агрегиране вместо това.
За разлика от mapReduce, това използва "местно кодирани" оператори и не се нуждае от интерпретация на JavaScript, за да работи. И това до голяма степен означава, че е „по-бързо“ и често много по-просто като конструкция.
Ето същата операция с .aggregate()
:
db.Cool.aggregate([
{ "$group": {
"_id": "$id",
"cools": { "$push": "$cool" }
}}
])
Същото нещо, по-малко кодиране и много по-бързо.
Извеждайки към друга колекция, вие използвате $out
:
db.Cool.aggregate([
{ "$group": {
"_id": "$id",
"cools": { "$push": "$cool" }
}},
{ "$out": "reduced" }
])
За протокола, ето изхода от mapReduce:
{ "_id" : "a", "value" : { "cools" : [ "a1", "a2" ] } }
{ "_id" : "b", "value" : { "cools" : [ "b1", "b2" ] } }
{ "_id" : "c", "value" : { "cools" : [ "c1" ] } }
{ "_id" : "d", "value" : { "cools" : [ "d1" ] } }
И съвкупната продукция. С единствената разлика от mapReduce _id
и value
задължителен изход е, че ключовете са обърнати, тъй като $group
не гарантира ред (но обикновено се наблюдава като обратен стек):
{ "_id" : "d", "cools" : [ "d1" ] }
{ "_id" : "c", "cools" : [ "c1" ] }
{ "_id" : "b", "cools" : [ "b1", "b2" ] }
{ "_id" : "a", "cools" : [ "a1", "a2" ] }