Under din inlärning kanske du har missat huvudmanualsidan på mapReduce . Det finns en viktig del information som du antingen missat eller inte har läst och lärt dig:
Och så lite efter det:
Så vad det i princip betyder är att eftersom "reduceraren" faktiskt inte bearbetar "alla" de unika nycklarna på en gång, förväntar den sig samma "input" som den ger "output", eftersom den utmatningen kan matas tillbaka till reduceraren igen.
Av samma anledning måste "mapparen" mata ut exakt vad som förväntas som "reducer"-utgången, som också är reducer-"ingången". Så du "ändrar" faktiskt inte datastrukturen alls, utan bara "minskar" den istället.
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"}
)
Nu hanterar du inmatningen som en array som också är utgången, sedan returneras de förväntade resultaten.
Nästa sak att lära sig är att i de flesta case mapReduce är inte riktigt vad du vill använda, och att du bör använda aggregationsramverk istället.
I motsats till mapReduce, använder detta "nativet kodade" operatorer och behöver ingen JavaScript-tolkning för att köras. Och det betyder till stor del att den är "snabbare" och ofta mycket enklare i konstruktionen.
Här är samma operation med .aggregate()
:
db.Cool.aggregate([
{ "$group": {
"_id": "$id",
"cools": { "$push": "$cool" }
}}
])
Samma sak, mindre kodning och mycket snabbare.
Utmatning till en annan samling använder du $out
:
db.Cool.aggregate([
{ "$group": {
"_id": "$id",
"cools": { "$push": "$cool" }
}},
{ "$out": "reduced" }
])
För att ta reda på, här är mapReduce output:
{ "_id" : "a", "value" : { "cools" : [ "a1", "a2" ] } }
{ "_id" : "b", "value" : { "cools" : [ "b1", "b2" ] } }
{ "_id" : "c", "value" : { "cools" : [ "c1" ] } }
{ "_id" : "d", "value" : { "cools" : [ "d1" ] } }
Och den sammanlagda produktionen. Med den enda skillnaden från mapReduce _id
och value
Madatory output är att nycklarna är omvända, eftersom $group
garanterar inte en order (men ses i allmänhet som en omvänd stack):
{ "_id" : "d", "cools" : [ "d1" ] }
{ "_id" : "c", "cools" : [ "c1" ] }
{ "_id" : "b", "cools" : [ "b1", "b2" ] }
{ "_id" : "a", "cools" : [ "a1", "a2" ] }