Как часть моих исследований, мы недавно начали изучать 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,
..
Я безуспешно пытаюсь создать желаемую структуру.
Это лучшее, что мне удалось сделать, и я до сих пор не знаю, как написать функцию приведения.
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",
}
)
Буду очень признателен за любую помощь:)