mongoose创build与推多个参考

所以有一个与我的数据库的嵌套结构这里是我的三个模式:用户架构:

var UserSchema = new mongoose.Schema({ email: { type: String, lowercase: true, unique: true, required: true }, password: { type: String, required: true }, role: { type: String, enum: ['trainer', 'client', 'admin'], default: 'client' }, trainer: { type: mongoose.Schema.Types.ObjectId, ref: 'User' }, programs: [ { type: mongoose.Schema.Types.ObjectId, ref: 'Program' } ], diet: [ { calories: { type: Number }, protein: { type: Number }, fats: { type: Number }, carbs: { type: Number }, fiber: { type: Number } }], stats: { bodyweight: [ { _id: false, measurement:{ type: Number}, time : { type : Date, default: Date.now } } ] }, name: { type: String, required: true }, }, { timestamps: true }); 

程式架构:

 var ProgramSchema = new mongoose.Schema({ title: {type: String, required: true}, description: {type: String, required: true}, createdby: { type: mongoose.Schema.Types.ObjectId, ref: 'User' }, exercises: [ { exercise:{ type: mongoose.Schema.Types.ObjectId, ref: 'Exercise' }, sets:{ type: Number } } ] }, { timestamps: true }); 

和练习模式:

 var ExerciseSchema = new mongoose.Schema({ name: { type: String, lowercase: true, unique: true, required: true }, description: { type: String, required: true }, video: { type: String }, image: { type: String } }, { timestamps: true }); 

正如你所看到的,一个用户可以有许多程序,一个程序可以有很多练习。 但是,当我返回一个用户对象,即使使用填充函数,用户程序内的练习不填充。 我相信这是我如何创build一个程序,从我的理解,我必须将锻炼对象推入程序,但我不知道如何创build一个程序,并在同一时间推入练习。 这是我目前的创build程序的function:

 exports.createProgram = function(req, res, next){ Program.create({ title : req.body.title, description: req.body.description, exercises: req.body.exercises, createdby: req.body.createdby }, function(err, program) { if (err){ res.send(err); } Program.find(function(err, programs) { if (err){ res.send(err); } res.json(programs); }); }); } 

有没有办法,我可以做些什么forEach req.body.exercises也许? 在此先感谢这里也是我如何返回用户:

 exports.getClients = function(req, res, next){ var trainerid = req.params.trainerid; User.find({trainer: trainerid}) .populate({ path: 'programs', populate: { path: 'exercises' } }) .exec(function (err, clients) { if (err) return handleError(err); console.log(clients); res.json(clients); }); } 

我认为你走在正确的道路上,但是你却错误地使用了exercise 。 而不是填充exercises ,你需要填充exercises.exercise

尝试这个:

 User.find({trainer: trainerid}) .populate({ path: 'programs', populate: { path: 'exercises.exercise' } }) .exec(function (err, clients) { if (err) return handleError(err); console.log(clients); res.json(clients); });