这是我在课程上的架构
var CourseSchema = mongoose.Schema({
students:[{ type: ObjectId, ref: 'User' }]
});
var CourseModel = mongoose.model('Course',CourseSchema);
var UserSchema = mongoose.Schema({ name:String})
var UserModel = mongoose.model('User',UserSchema);
在mongodb中,我创建了现有的课程和用户,当用户想要参加课程时,用户参考将被添加到课程模型中的学生数组中。
以下是我尝试将用户引用添加到学生的方法
function joinCourse(cid,uid,callback){
var options = { new: false };
var uid = mongoose.Types.ObjectId(uid);
CourseModel.findOneAndUpdate({'_id':cid},{'$addToSet':{'students':uid}},options,function(err,ref){
if(err) {
console.log('update joinCourse'.red,err);
callback(err, null);
}else{
console.log('update joinCourse '.green+ref);
callback(null,ref);
}
})
}
执行上述功能时,students数组具有userID或用户的引用。但是,当我想从课程模型中填充学生时,它不起作用。
var id = mongoose.Types.ObjectId(id);
CourseModel.findById(id).populate('students').exec(function(err, users) {
if(err){callback(err, null);}
else{
//// users.length == undefined
console.log("findCourseStudentsById".green,users.length);
callback(null, users);
}
})
我没有发现填充函数有任何问题,所以我想知道joinCourse函数有什么问题吗?所以我将功能更改为
courseModel.findCourseById(cid,function(err,course){
if(err) next(err);
else{
course.students.push({'_id': mongoose.Types.ObjectId(uid)});
course.save(function (err) {
if (err) next(err);
});
}
})
但仍然填充不起作用。注意,我使用的是mongoose 3.6
答案 0 :(得分:2)
populate
填充模型实例,但回调传递给您调用populate的模型实例,而不是填充的数据本身:
CourseModel.findById(id).populate('students').exec(function(err, course) {
if(err){callback(err, null);}
else{
console.log("findCourseStudentsById".green, course.students.length);
callback(null, course);
}
});