Карта мангуста уменьшает возвращает неверный результат, когда ввод равен
Я хотел попробовать функцию уменьшения карты Мангуста и закончил следующим образом:
// See: http://mongoosejs.com/docs/api.html#mongoose_Mongoose-Model
function mapReduceStatistic(homework) {
let mapReduceObject = {};
mapReduceObject.map = function () {
// each submission contains the exercises array which stores the picked answer for each exercise of the student
this.exercises.forEach(function (pickedAnswer, i) {
// key is index of the exercise in exercise array
// value is map of:
emit(i, pickedAnswer);
});
};
mapReduceObject.reduce = function (keyExerciseIndex, mapArray) {
let pickedAnswers = [];
pickedAnswers[0] = 0;
pickedAnswers[1] = 0;
pickedAnswers[2] = 0;
pickedAnswers[3] = 0;
mapArray.forEach(function (pickedAnswer, i) {
pickedAnswers[pickedAnswer]++;
});
return {pickedAnswers: pickedAnswers};
};
mapReduceObject.query = {
homework: homework._id
};
return SubmissionModel.mapReduce(mapReduceObject).then((statistics) => {
if(!statistics) throw Error("Error in map reduce");
return statistics;
});
}
Он отлично работает и отображает каждое упражнение каждой подачи текущей домашней работы. На каждого учащегося отправляется одно домашнее задание, и я хочу уменьшить количество выбранных ответов для каждого упражнения (для каждого упражнения есть 4 варианта, из которых вы можете выбрать ответ).
Модель представления:
//submission Schema with an array of indexes of the picked answer of each
//exercise of an homework and the assigned Homework
// exercises values between zero and three
const SubmissionSchema = new mongoose.Schema({
exercises: {
type: [Number],
required: true
},
homework: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Homework',
required: true
},
student: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User',
required: true
}
},{ collection: 'submission' });
Проблема: это не работает, если есть только одна входная модель. Если есть только один студент, который отправил свою домашнюю работу и, следовательно, только одну заявку на эту домашнюю работу в базе данных, то при уменьшении карты каждое значение массива submission.exercises возвращается в качестве одного значения результата массива вместо карты selectedAnswers.
Это неверный результат, когда в базе данных есть только одна модель:
{ results:
[ { _id: 0, value: 0 },
{ _id: 1, value: 0 },
{ _id: 2, value: 1 } ],
stats:
{ processtime: 51,
counts: { input: 1, emit: 3, reduce: 0, output: 3 },
timing:
{ mapTime: 0,
emitLoop: 51,
reduceTime: 0,
mode: 'mixed',
total: 51 } } }
Почему это происходит? Похоже, что map и Reduce даже не запускаются один раз, и вместо этого возвращается массив результатов. Я даже могу вернуть {"Hello World"} в функции Reduce, и он все равно выведет массив упражнений вместо Hello World.
Спасибо за вашу поддержку!
Полный код см. По адресу: https://github.com/andrelandgraf/high5-learning-backend Если у вас есть какие-либо фрагменты кода или информация, дайте мне знать.