我在做一個考試系統(tǒng),系統(tǒng)中有4個集合:
教師集合:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var TeacherSchema = new Schema({
userId: Number, // 教師工號
userName: String, // 用戶名
passWord: String, // 密碼
_papers:[{ type: Schema.Types.ObjectId, ref: 'Paper' }]
})
module.exports = mongoose.model('Teacher', TeacherSchema);
學(xué)生集合:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var StudentSchema = new Schema({
userId: Number, // 學(xué)號
userName: String, // 用戶名
passWord: String, // 密碼
grade: Number, // 年級 1~6 分別代表一年級到六年級
class: Number, // 班級
exams:[{ // 參加的考試
_papers:{ type: Schema.Types.ObjectId, ref: 'Paper' },
date: Date,
score:Number
}]
})
module.exports = mongoose.model('Student', StudentSchema);
試卷集合:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var PapersSchema = new Schema({
name: String, // 試卷名
totalPoints: Number, // 總分
time: Number, // 考試時間
startTime: Date, // 開始時間
examnum: Number, // 考試人數(shù)
_teacher: { type: Schema.Types.ObjectId, ref: 'Teacher'}, // 老師
_questions: [{ type: Schema.Types.ObjectId, ref: 'Question' }] // 題
})
module.exports = mongoose.model('Paper', PapersSchema);
問題集合:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var QuestionSchema = new Schema({
name: String, // 問題名
_teacher: { type: Schema.Types.ObjectId, ref: 'Teacher' }, // 所屬老師
_papers: [{ type: Schema.Types.ObjectId, ref: 'Paper' }], // 所屬試卷
content: String, // 內(nèi)容
selection: [String], // 選項
type: {type:String,enum:[ // 類型
'single', // 單選
'multi', // 多選
'Q&A', // 簡答
'judgement' // 判斷
]},
score: Number, // 分值
answer: String // 答案
});
module.exports = mongoose.model('Question', QuestionSchema);
在系統(tǒng)中,教師可以增加試卷,這個時候我就不知道該怎么保存前臺傳過來的數(shù)據(jù)。數(shù)據(jù)中既有試卷的信息,也有很多題目。題目都屬于該試卷,改試卷又屬于當(dāng)前登錄系統(tǒng)的老師(即創(chuàng)建試卷的老師)。
怎么才能讓試卷、教師、問題關(guān)聯(lián)起來啊,ref存的是_id,然而這些新增的數(shù)據(jù),是保存之后才有_id的啊。
這個問題已經(jīng)困擾我很多天了,希望有大神能夠解答一下,感激不盡??!
先說聲謝謝了~
自問自答!
// 模擬前端返回的數(shù)據(jù)
paperForm = {
name: '試卷名',
total: 100,
....
questions: [
{
name: '問題1',
answer: 'A',
type: 'single',
...
},
{
name: '問題2',
answer: 'A',
type: 'single',
...
},
...
]
}
exports.savePaper = function (req, res) {
let paperForm = req.body.paperForm;
let userName = req.session.userName;
// console.log(paperForm);
// console.log(userName);
if(paperForm == {}){
res.json({
status:'5',
msg: '數(shù)據(jù)不能為空'
})
}
Teacher.findOne({"userName": userName}, (err,doc)=>{
if (err) {
res.json({
status:'1',
msg: err.message
})
} else {
if (doc) {
let paperData = {
name:paperForm.name,
totalPoints:paperForm.totalPoints,
time:paperForm.time,
_teacher: doc._id,
_questions: [],
examnum:0
}
Paper.create(paperData,function (err1,doc1) {
if (err1) {
res.json({
status:'1',
msg: err.message
})
} else {
if (doc1) {
// console.log('doc1 paper:'+doc1._id);
doc._papers.push(doc1._id); // 教師中添加該試卷
doc.save(); // 很重要 不save則沒有數(shù)據(jù)
// console.log('doc teacher'+doc._papers);
paperForm.questions.forEach(item => {
item._papers = [];
item._papers.push(doc1._id);
item._teacher = doc._id;
})
Question.create(paperForm.questions,function (err2,doc2) {
if (err2) {
res.json({
status:'1',
msg: err.message
})
} else {
if (doc2) {
// console.log('doc2 ques:'+doc2)
doc2.forEach(item => {
doc1._questions.push(item._id);
})
doc1.save(); // 很重要 不save則沒有數(shù)據(jù)
res.json({
status:'0',
msg: 'success'
})
} else {
res.json({
status: '2',
msg:'沒找到題目'
})
}
}
})
} else {
res.json({
status: '2',
msg:'沒找到試卷'
})
}
}
})
}
else {
res.json({
status: '2',
login: false,
msg:'請登錄'
})
}
}
})
};
這個是我的實現(xiàn)方法,這已經(jīng)算是‘回調(diào)地獄’了,有需要可以自己用Promise優(yōu)化。
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團,成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達內(nèi)教育集團成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。