已解决
原来 map reduce 中的 map function 和 reduce function 所返回的结构中的属性名都必须一样。好坑爹啊。。。
key=this.name;
value={
count:1,
salary:this.salary
};
emit(key,value);
reduce_val={count:0,salary:0}; //属性名必须和map的emit中一样
文档格式是这样的:
{
"_id" : ObjectId("52108dddd81bee8dfd61228b"),
"name" : "Jobs",
"birth" : ISODate("2001-03-04T09:03:25Z"),
"likes" : [],
"skills" : [
{
"codeLanguage" : "Ruby",
"level" : 3
}
],
"address" : {
"city" : "D.C",
"zipCode" : 29607
},
"salary" : 2107
}
//map func
var map_func=function(){
key=this.name;
value={
count:1,
salary:this.salary
};
emit(key,value);
}
//reduce func
var reduce_func=function(key,value){
reduce_val={count:0,total_salary:0};
print(value[0].count+"and"+value[0].salary);
for (var i = 0; i<value.length; i++) {
reduce_val.count+=value[i].count;
reduce_val.total_salary+=parseInt(value[i].salary);
};
return reduce_val;
}
var finalize_func=function(key,reduce_val){
reduce_val.avg=reduce_val.total_salary/reduce_val.count;
return reduce_val;
}
db.pixel.mapReduce(
map_func,
reduce_func,
{
out:"map_reduce_avg",
query:{
"skills.1":{$exists:1}
},
finalize:finalize_func
}
)
我通过print()
函数发现,reduce 函数中的value[0].salary
只有前 6 次是有值的,之后就全部变成了undefined
的了。。。而这个 6 次又正好和 key 的个数相同。。。我想他们之间一定有联系,只是不明白,为什么第七次开始的 reduce 就全部undefined
了呢。
1and3222
1and3303
1and2376
1and2721
1and2958
1and3280
16andundefined
13andundefined
21andundefined