在线考试系统之成绩统计
2016-11-29 本文已影响96人
淡就加点盐
MongoDB 聚合(aggregate() 方法)
1 语法
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

2 答题表定义
学生ID
userId
,题目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 学生成绩表定义
学生ID
userId
,课程名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 统计结果
