map reduce函数返回id而不是count

时间:2012-12-12 10:46:07

标签: mongodb mapreduce mongoengine

我正在应用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函数,所以花了更多的时间。

2 个答案:

答案 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;} “”“