Карта мангуста уменьшает возвращает неверный результат, когда ввод равен

Я хотел попробовать функцию уменьшения карты Мангуста и закончил следующим образом:

// 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 Если у вас есть какие-либо фрагменты кода или информация, дайте мне знать.

0 ответов

Другие вопросы по тегам