1

I m applying map reduce function but facing an issue. In case of one record it returns the id instead of count = 1.

    map_func = """function () {
        emit(this.school_id, this.student_id);
    }"""
    reduce_func = """
        function (k, values) {               
                values.length;
        }
    """

if school 100 has only one student then it should return school id 100 , value =1 but in this scenario it return schoolid = 100 , value = 12 ( 12 is its student id in db ). for other records it works fine.

        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/ i used this example but it uses two maps-reduce function so it took much more time.

4

2 に答える 2

2

mapReduce のメカニズムの一部を誤解しているようです。

エミットはすべてのドキュメントで呼び出されますが、reduce は複数の値がエミットされたキーでのみ呼び出されます (reduce 関数の目的は、結果の配列を 1 つにマージまたは削減することであるため)。

マップ関数が間違っています。キーを発行してから、必要な値を発行する必要があります。この場合はカウントです。

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 に答える