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

, 사용자가 많은 프로그램을 가질 수 있고 프로그램이있을 수 있습니다 많은 연습. 그러나 populate 함수를 사용하는 경우에도 사용자 객체를 반환 할 때 사용자 프로그램 내의 연습은 채워지지 않습니다. 나는 이것이 내가 프로그램을 만드는 방법에 대한 믿음에서 운동 목표를 프로그램 안으로 밀어 넣어야한다는 것을 이해하고 있지만 어떻게 프로그램을 만들고 동시에 연습 문제를 푸는 지 잘 모르겠다.

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

     }); 

    }); 

} 

내가 어쩌면 req.body.exercises에 좀 대해 forEach의 일부를 할 수있는 방법이 있나요 : 이것은 내 현재 생성 프로그램 프로그램 기능입니까? 내가 사용자를 반환하는 방법을 미리 에서 덕분에 또한 여기에 있습니다 :

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

당신은 스타입니다, 정말 고마워요. 나는 내가이 점을 didnt한다라고 생각하지 않는다. – Delboyeire