Mongodb 映射reduce函数返回id而不是count

Mongodb 映射reduce函数返回id而不是count,mongodb,mapreduce,mongoengine,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; }

我正在应用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是其学生id,单位为db)。对于其他记录,它工作正常

        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});
    }
    """

我使用了这个示例,但它使用了两个Map reduce函数,因此花费了更多的时间。

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

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

您的映射函数是错误的-它需要发出一个键,然后是一个您想要的值-在本例中是一个计数

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


我建议您阅读更多详细信息。

如果您试图计算每所学校的学生人数: map=“”发射(this.school_id,1)”


reduce=“”函数(key,values){var total=0;for(var i=0;i问题是当count=1时,它没有进入reduce函数。它不需要进入reduce函数-reduce用于组合映射函数的多个结果。我想你需要回顾一下它的工作原理。您的reduce应该将它获得的数组中的所有计数添加到当前运行计数。您误解了emit的功能。您必须发出所需的实际最终结果。100学校有1名学生,所以你必须排放1。Reduce是您添加所有不同发射值的地方。用户还应该针对每个学校区分一件事。上面的代码工作正常,但如果学生id=1有3个针对学校1的条目,那么reurn应该是学校id=1,计数=1这就是我使用map reudce twicei的原因我不知道你的模型,但我知道你如何在地图中使用对象作为id,比如:map=“””emit({scid:this.school\u id,stid:this.student\u id},1)”我已经在第一张地图上发布了上面的所有代码,用学校id和用户id制作一个dict,计数为1。嗨,上面的问题有什么解决方案吗