Node.js 使用推送创建多个参照的Mongoose

Node.js 使用推送创建多个参照的Mongoose,node.js,mongodb,mongoose,mongoose-schema,mongoose-populate,Node.js,Mongodb,Mongoose,Mongoose Schema,Mongoose Populate,因此,我的数据库有一种嵌套结构,这是我的三种模式: 用户架构: var UserSchema = new mongoose.Schema({ email: { type: String, lowercase: true, unique: true, required: true }, password: { type: String, required: true }

因此,我的数据库有一种嵌套结构,这是我的三种模式: 用户架构:

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

        });

    });

}
我能不能做一些关于身体锻炼的前奏? 提前谢谢 下面是我返回用户的方式:

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

}

我认为你走的是正确的道路,但你的
练习是错误的。
您不需要填充
练习
,而需要填充
练习。练习

试试这个:

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

你能展示一下你的
要求的身体练习吗
?你是明星,非常感谢。我不敢相信我竟然没有发现这个