在线考试系统之成绩统计

MongoDB 聚合(aggregate() 方法)

1 语法
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
在线考试系统之成绩统计_第1张图片
aggregate详细步骤
2 答题表定义

学生IDuserId,题目IDquestionId,课程名subject,回答内容answerCtn,得分score

/* 回答内容定义 */
var answerSchema = new Schema({
    userId: {type: ObjectId, ref: 'User'},
    questionId: {type: ObjectId, ref: 'Question'},
    subject: String,
    answerCtn: String,
    score: Number,
    meta: {
        updateAt: {type:Date, default: Date.now()},
        createAt: {type:Date, default: Date.now()}
    }
});
3 学生成绩表定义

学生IDuserId,课程名subject,成绩score

/* 学生成绩定义 */
var gradeSchema = new Schema({
    userId: {type: ObjectId, ref: 'User'},
    subject: String,
    score: Number,
    meta: {
        updateAt: {type:Date, default: Date.now()},
        createAt: {type:Date, default: Date.now()}
    }
});
4 统计方法
  • 成绩统计是指对某一个学生的某门课程每道题目得分的总和。
  • aggregate()方法先利用$match查询处课程为WEB的答题列表,$group将学生ID一样的数据组合成一个集合,$sum计算同一集合里的score总和
  • aggregate()结果依次保存进学生成绩表grade
//统计成绩
exports.statisticScore = function (data, cb) {
    async.waterfall([
        function (cb) {
            Answer.aggregate([
                { $match: { subject: "WEB" }},
                { $group: { _id: "$userId", totalScore: { $sum: "$score" }}}
            ], function (err, docs) {
                if (err) {
                    console.log(err);
                } else {
                    cb(err, docs);
                }
            });
        },
        function (result, cb) {
            for(var i = 0; i < result.length; i++) {
                var grade = new Grade({
                    userId: result[i]._id,
                    subject: "WEB",
                    score: result[i].totalScore
                });
                grade.save(function (err, doc) {
                    if(err) {
                        console.log(err);
                        entries.code = 99;
                    }
                });
            }
            cb(null, entries);
        }
    ], function (err, result) {
        cb(true, result);
    });
    console.log("done");
};
5 统计结果
aggregate()结果

你可能感兴趣的:(在线考试系统之成绩统计)