1

我正在应用 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,但在这种情况下,它返回学校 ID = 100,值 = 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/ 我使用了这个例子,但它使用了两个 maps-reduce 函数,所以需要更多时间。

4

2 回答 2

2

看起来你可能误解了 mapReduce 的一些机制。

emit 将在每个文档上调用,但 reduce 只会在发出多个值的键上调用(因为 reduce 函数的目的是将一组结果合并或归约为一个)。

你的 map 函数是错误的——它需要发出一个键,然后是一个你想要的值——在这种情况下是一个计数。

您的 reduce 函数需要减少这些计数(添加它们),但即使它被多次调用它也必须正常工作(以重新减少以前减少的结果)。

我建议阅读此处了解更多详细信息。

于 2012-12-12T10:52:23.710 回答
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;} """

于 2012-12-12T11:14:01.810 回答