mongoose关联表新增数据怎么关联

我在做一个考试系统,系统中有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);

学生集合:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var StudentSchema = new Schema({
    userId: Number, // 学号
    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, // 考试人数
    _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, // 内容
  selection: [String], // 选项
  type: {type:String,enum:[ // 类型
    'single', // 单选
    'multi', // 多选
    'Q&A', // 简答
    'judgement' // 判断
  ]},
  score: Number, // 分值
  answer: String // 答案
});
module.exports = mongoose.model('Question', QuestionSchema);

在系统中,教师可以增加试卷,这个时候我就不知道该怎么保存前台传过来的数据。数据中既有试卷的信息,也有很多题目。题目都属于该试卷,改试卷又属于当前登录系统的老师(即创建试卷的老师)。
怎么才能让试卷、教师、问题关联起来啊,ref存的是_id,然而这些新增的数据,是保存之后才有_id的啊。
这个问题已经困扰我很多天了,希望有大神能够解答一下,感激不尽!!
先说声谢谢了~

阅读 4k
1 个回答

自问自答!

// 模拟前端返回的数据
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: '数据不能为空'
    })
  }
  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则没有数据
              // 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则没有数据
                   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:'请登录'
        })
      }
    }
  })
};

这个是我的实现方法,这已经算是‘回调地狱’了,有需要可以自己用Promise优化。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进