mongodb mapReduce implementation rationale

data-struct:
{"bookname":"bname1","battr":"bookattr1","scores" : [ { "userid" : "user1", "score" : 3 }, { "userid" : "user2", "score" : 4 } ]}

var m=function(){
    for(var i=0;i<this.scores.length;i++){
        if(this.scores[i].userid==userid){
            emit(this.scores[i].userid,{count:1,score:this.scores[i].score});
            }
        }
    }
var r=function(key,value){
    var z={count:0,score:0};
    for(var ii=0;ii<value.length;ii++){
        z.count+=value[ii].count;
        z.score+=value[ii].score;
    }
    return z;
}
db.book.mapReduce(m,r,{out:"tmp",scope:{"userid":"user2"}})

map reduce 这两个涵数是怎么关联操作的,经过多次实验,终于是破开云雾见天晴了

与其说 map 中的 emit 是把信息提交给 reduce 倒不如说是 map 与 reduce 只是在操作同一个collection,这样来理解的方便。
out:这个参数就是用于生成实际文件文档的还是在内存中形成的文档
可以理解成比如:从book中先选择出你相要的数据,可以通过 map 这个凾数进行分组 emit() 这个凾数就是干这个用的,然后它会根据 out 这个参数在什么地方生成一个 collection
out:”tmp” 等于是新建了一个 collection 里面的数据就是通 map 分组了的数据。

分组后的 collection 只会包含两个字段,一个是 “_id” 一个就是 “value” ,这两个字段的值就是 emit(”,”) 这个凾数的第一个参数与第二个参数,
比如上面的代码分组后的文档内容就是:

{"_id":"user1","value":[{"count":1,"scour":},{"count":1,"score":}]}
{"_id":"user2","value":[{"count":1,"scour":},{"count":1,"score":}]}
...
...

等等
等于就是把从book中搜出来的数据,按emit(”,”) 这个凾数中的每一个参数,把这个参数中的所有的内容已数组的形式重新组合了一下.

reduce 这个凾数等于就是操作 map 凾数执行后生成的 collection 的内容.

finalize 这个涵数就是可以更进一步的操作 collecton 中的内容

    原文作者:wapeyang
    原文地址: https://segmentfault.com/a/1190000000489426
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞