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);
});
你能展示一下你的要求的身体练习吗
?你是明星,非常感谢。我不敢相信我竟然没有发现这个