我知道有很多关于它的答案,但我仍然没有完全理解。
我有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
与学生一起CourseSchema
,enrolledCourses
在StudentSchema
学习一门课程。
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 - -
答案 0 :(得分:0)
您缺少填充指令。例如:
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");
}
});
});
});
});
});