在線考試系統之成績統計

MongoDB 聚合(aggregate() 方法)

1 語法
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
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()結果
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,765評論 18 399
  • 一. Java基礎部分.................................................
    wy_sure閱讀 3,835評論 0 11
  • 50個常用的sql語句Student(S#,Sname,Sage,Ssex) 學生表Course(C#,Cname...
    哈哈海閱讀 1,254評論 0 7
  • 周六,加班。和往常不一樣的是,涂小丫沒有坐地鐵回去,蹭了同事的車。天氣預報說明天會有臺風,所以今天也像提醒似的下著...
    一馬踏平川閱讀 164評論 0 0
  • 給UIlabel創建分類 UILabel+LabelHeight.h 1.在.h中寫接口,傳給它必要的參數 /**...
    9e5f2143c765閱讀 1,650評論 1 1