首页 > 解决方案 > MongoDB - 是否可以在 MapReduce 中编写几个不同的函数?

问题描述

作为我学习的一部分,我们最近开始学习 MongoDB,所以我在这个领域还很年轻。在我们分配的一项任务中,使用了 MapReduce,但我无法正确执行。

提供以下形式的学生集合:

{
_id: ObjectId("4ffmdjd8cfd99k03"),
tz: "11111",
FirstName: "Anton",
LastName: "Gill",
Department: "Computer Science"
Year: 1
Courses: [ { name: "Linear Algebra 1", grade: 70}, {name: "OS", grade: 88}]
}

任务是编写一个 mapReduce 函数,使其返回每个部门和每年的学生姓名列表,所有学生的成绩都大于 90。正常输出示例:

[{Department: "Computer Science", Year: 1, students: ["Anton", "John"]},
{Department: "Physics", Year: 2, students: ["Dean", "David"]}]

我可以编写多个地图函数吗?也就是说,mapReduce 结构将如下所示:

db.students.mapReduce(
    map1,
    map2,
    map3,
    ..
    reduce,
..

我尝试创建所需的结构没有成功。这是我能做到的最好的,我仍然不确定如何编写 reduce 函数。

var map = function(){
    var value = 0, n = this.Courses.length;
    for(var i = 0; i < n; i++){
        value += this.Courses[i].grade;
    }
    var avgGrade = value/n;
    if(avgGrade > 90){
        var key = {
        tz:this.tz,
        Department:this.Department,
        Year:this.Year,
        };
        value = {students:[this.FirstName]};
    }
    emit(key, value);
};

var reduce = function(keysObj, valuesObj){
    return 1000; //Ignore this function, I've no idea how to deal with it.
};

db.students.mapReduce(
    map,
    reduce,
    {
    out: "output",
    }
)

我非常感谢任何帮助:)

标签: mongodbmapreduce

解决方案


推荐阅读