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 中的内容