一次保存多个对象 Mongo(多对多 Mongoose)
Save multiples Objects At Once Mongo(Many To Many Mongoose)
这是我的场景:
我有 2 个集合(表):项目和学生(多对多关系)。
我的模型是:
项目:
var ProjectSchema = new Schema({
name: {
type: String
},
description: {
type: String
},
user : {
type : Mongoose.Schema.Types.ObjectId,
ref : "User"
}
});
Mongoose.model('Project', ProjectSchema);
用户:
var Userchema = new Schema({
name: {
type: String
},
surname: {
type: String
},
project : {
type : Mongoose.Schema.Types.ObjectId,
ref : "Project"
}
});
Mongoose.model('User', UserSchema);
在我看来,我有 2 个输入,用于接收项目的名称和描述,然后进行多选,为该项目选择 1 个或多个用户。当我单击“确定”时应该:
- 创建项目,并将所有在BBDD中选择为对象的用户添加到用户。
- 更新用户,与项目关联。
我尝试下一个,但只有在我选择 1 个用户时才会起作用:
exports.addUserProject = function(req, res) {
var project=new svmp.Project();
project.name=req.body.name;
project.description=req.body.description;
project.user=req.body.user[0]._id;
project.save(function(err,project){
if (err) {
return res.send(400, {
message : getErrorMessage(err)
});
} else {
res.jsonp(project);
}
})
};
我BBDD中的结果是下一个:
{ “_id”:ObjectId(“57a200a38fae140913ac5413”),"user":ObjectId(“578f41ddb0641d961416c3f5”),"name":"Project1","Description":"Project1 Desc","__v" : 0 }
感谢您的帮助
首先在您的架构定义中,由于关系是多对多的,您应该将 ref
更改为引用对象的数组。例如,将 projectSchema
的 user
属性 更改为像这样的对象 ID 数组,
var ProjectSchema = new Schema({
name: {
type: String
},
description: {
type: String
},
user : [{
type : Mongoose.Schema.Types.ObjectId,
ref : "User"
}]
});
对 userSchema
的 project
属性 执行相同操作。
其次,在这一行project.user=req.body.user[0]._id
;您仅将第一个选定用户的 _id
设置为用户,而忽略所有其他选定用户。这就是为什么您的代码只适用于一个用户。相反,我会建议您使用一个简单的循环将所有选定用户的 _id
推送到项目的 user
属性。您可以使用下面给出的 forEach
循环。
var selectedUsers = req.body.user;
selectedUsers.forEach(function(u){
project.user.push(u._id)
})
如果您愿意,您也可以使用简单的 for loop
来完成此操作。
我相信以上建议应该可以解决您描述的问题。
这是我的场景:
我有 2 个集合(表):项目和学生(多对多关系)。
我的模型是:
项目:
var ProjectSchema = new Schema({ name: { type: String }, description: { type: String }, user : { type : Mongoose.Schema.Types.ObjectId, ref : "User" } }); Mongoose.model('Project', ProjectSchema);
用户:
var Userchema = new Schema({ name: { type: String }, surname: { type: String }, project : { type : Mongoose.Schema.Types.ObjectId, ref : "Project" } }); Mongoose.model('User', UserSchema);
在我看来,我有 2 个输入,用于接收项目的名称和描述,然后进行多选,为该项目选择 1 个或多个用户。当我单击“确定”时应该:
- 创建项目,并将所有在BBDD中选择为对象的用户添加到用户。
- 更新用户,与项目关联。
我尝试下一个,但只有在我选择 1 个用户时才会起作用:
exports.addUserProject = function(req, res) {
var project=new svmp.Project();
project.name=req.body.name;
project.description=req.body.description;
project.user=req.body.user[0]._id;
project.save(function(err,project){
if (err) {
return res.send(400, {
message : getErrorMessage(err)
});
} else {
res.jsonp(project);
}
})
};
我BBDD中的结果是下一个:
{ “_id”:ObjectId(“57a200a38fae140913ac5413”),"user":ObjectId(“578f41ddb0641d961416c3f5”),"name":"Project1","Description":"Project1 Desc","__v" : 0 }
感谢您的帮助
首先在您的架构定义中,由于关系是多对多的,您应该将 ref
更改为引用对象的数组。例如,将 projectSchema
的 user
属性 更改为像这样的对象 ID 数组,
var ProjectSchema = new Schema({
name: {
type: String
},
description: {
type: String
},
user : [{
type : Mongoose.Schema.Types.ObjectId,
ref : "User"
}]
});
对 userSchema
的 project
属性 执行相同操作。
其次,在这一行project.user=req.body.user[0]._id
;您仅将第一个选定用户的 _id
设置为用户,而忽略所有其他选定用户。这就是为什么您的代码只适用于一个用户。相反,我会建议您使用一个简单的循环将所有选定用户的 _id
推送到项目的 user
属性。您可以使用下面给出的 forEach
循环。
var selectedUsers = req.body.user;
selectedUsers.forEach(function(u){
project.user.push(u._id)
})
如果您愿意,您也可以使用简单的 for loop
来完成此操作。
我相信以上建议应该可以解决您描述的问题。