鍍金池/ 問答/數(shù)據(jù)庫/ mongoose關(guān)聯(lián)表新增數(shù)據(jù)怎么關(guān)聯(lián)

mongoose關(guān)聯(lián)表新增數(shù)據(jù)怎么關(guān)聯(lián)

我在做一個考試系統(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], // 選項(xiàng)
  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:'請登錄'
        })
      }
    }
  })
};

這個是我的實(shí)現(xiàn)方法,這已經(jīng)算是‘回調(diào)地獄’了,有需要可以自己用Promise優(yōu)化。

2017年11月21日 11:52