具有ref数组的Mongoose NodeJS Schema

时间:2017-07-09 11:31:21

标签: node.js mongodb mongoose populate ref

我知道有很多关于它的答案,但我仍然没有完全理解。 我有CourseSchema

const CourseSchema = new Schema({
course_name: String,
course_number: {type: String, unique : true },
enrolledStudents:[{
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Student' }]
});

StudentSchema

const StudentSchema = new Schema({
first_name: String,
last_name: String,
enrolledCourses:[{
    type: mongoose.Schema.Types.ObjectId,
    ref: 'CourseSchema'
    }]
});

我想在enrolledStudents与学生一起CourseSchemaenrolledCoursesStudentSchema学习一门课程。

router.post('/addStudentToCourse', function (req, res) {
Course.findById(req.params.courseId, function(err, course){
    course.enrolledStudents.push(Student.findById(req.params.studentId, function(error, student){
        student.enrolledCourses.push(course).save();
    })).save();
});
});

但发布时我收到错误:

  

TypeError:无法读取属性'enrolledStudents'的null

好的,准备好后Query-populate我这样做了:

router.post('/addStudentToCourse', function (req, res) {

    Course.
    findOne({ _id : req.body.courseId }).
    populate({
        path: 'enrolledStudents'
        , match: { _id : req.body.studentId }
    }).
    exec(function (err, course) {
        if (err) return handleError(err);
        console.log('The course name is %s', course.course_name);
    });
});

当我在邮递员上点击POST时,我上了控制台:

  

课程名称是cs的简介

但它正在装载以及后来在控制台上我得到:

  

POST / courses / addStudentToCourse - - ms - -

2 个答案:

答案 0 :(得分:0)

您缺少填充指令。例如:

see more about it here

Course.
  findOne({ courseId : req.params.courseId }).
  populate('enrolledStudents').
  exec(function (err, course) {
    if (err) return handleError(err);
    console.log('The course name is %s', course.name);

  });

它正在使用ref字段“知道”如何使用push语法填充输出。它就像一个外国人口。

只需在查询上调用populate方法,就会返回一个文档数组来代替原始的_ids。您可以在填充方法in the official docs

的内部了解更多信息

答案 1 :(得分:0)

这就是我所做的:

router.post('/addStudentToCourse', function (req, res) {
Student.findById(req.body.studentId, function(err, student){
    if(err) return next(err);
    Course.findById(req.body.courseId, function(err, course){
        if(err) return console.log(err);
        course.enrolledStudents.push(student);
        course.save(function (err) {
            if(err)
                console.log(err);
            student.enrolledCourses.push(course);
            student.save(function (err) {
                if (err)
                    console.log(err);
                else{
                    res.send("worked");
                }
            });
        });

    });
});
});