我正在应用map reduce功能但遇到问题。如果是一条记录,则返回id而不是count = 1。
map_func = """function () {
emit(this.school_id, this.student_id);
}"""
reduce_func = """
function (k, values) {
values.length;
}
"""
如果学校100只有一名学生,那么它应该返回学校ID 100,值= 1,但在这种情况下它会返回 schoolid = 100,value = 12(12是db中的学生ID)。对于其他记录,它工作正常。
map_func = """function () {
emit({this.school_id, this.student_id},{count:1});
}"""
reduce_func = """
function (k, values) {
var count =0 ;
values.forEach(function(v)
{
count += v['count'];
});
return {count:count};
}
"""
map_func2 = """
function() {
emit(this['_id']['school_id'], {count: 1});
}
"""
http://cookbook.mongodb.org/patterns/unique_items_map_reduce/ 我使用了这个例子,但它使用了两个map-reduce函数,所以花了更多的时间。
答案 0 :(得分:2)
看起来你可能误解了mapReduce的一些机制。
每个文档都会调用emit,但只会在发出多个值的键上调用reduce(因为reduce函数的目的是将一个结果数组合并或减少为一个)。
你的地图功能是错误的 - 它需要发出一个键,然后发出你想要的值 - 在这种情况下是一个计数。
你的reduce函数需要减少这些计数(添加它们),但即使多次调用它也必须正常工作(重新减少之前减少的结果)。
我建议您阅读here了解详情。
答案 1 :(得分:0)
如果您要计算每所学校的学生人数: map =“”“emit(this.school_id,1)”“”
reduce =“”“function(key,values){var total = 0; for(var i = 0; i< values.length; i ++){total + = values [i];} return total;} “”“