2017-04-06 89 views
1

創造所以有一種嵌套結構與我的DB這裏是我的三個模式: 用戶模式:貓鼬與推動多參

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 
}); 

正如你所看到的,一個用戶可以有許多程序和一個程序可以有很多練習。但是,當我返回一個用戶對象時,即使使用填充函數,用戶程序中的練習也不會填充。我相信這是我如何創建一個程序,從我的理解,我必須將鍛鍊對象推入程序,但我不知道我將如何創建一個程序,並在同一時間推入練習。這是我目前的創建程序功能:

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); 
     }); 

} 
+0

你能證明你的'req.body.exercises'? –

回答

1

我認爲你是在正確的道路上,但你必須populatedexercise錯誤。 而不是填充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); 
    }); 
+0

你是一位明星,非常感謝你。我不相信我沒有發現這一點,但 – Delboyeire