如何在猫鼬多对多关系中建模和保存?
How to model and save in mongoose multi-to-multi relationship?
我想要2个模型,一个是可以属于多个组的用户,另一个是可以有多个用户的组。
这是我的模式和模型,我不知道它们是否正确:
var Schema = mongoose.Schema;
var UserSchema = new Schema({
joinedGroups:[{type:Schema.Types.ObjectId, ref: 'Group'}]
}
);
var GroupSchema = new Schema({
createdBy: {type: Schema.Types.ObjectId, ref: 'User'},
joinedUsers:[{ type: Schema.Types.ObjectId, ref: 'User' }]
});
var User = mongoose.model('User',UserSchema);
var Group = mongoose.model('Group',GroupSchema);
当收到 url:/api/groups 的 POST 和 user._id 的正文时,我想将此用户加入新创建的组,此外,我想将这个新创建的组加入用户的 joinedGroups,最后我想用其中的用户响应新组的客户端。以下是我执行此操作的代码:
app.post('/api/groups', 函数(req, res){
console.log(req.body);
var userId = req.body.user_id;
var group = {
createdBy : userId
};
Group.create(group, function(err,group){
if(err){
console.log('create group err');
res.send(err);
}
else{
console.log('create group success');
User.update({_id: userId},
{$push: {joinedGroups: group._id}},
function(err,user){
if(err){
console.log('update user err');
res.send(err);
}
else{
Group.update({_id: group._id},
{$push: {joinedUsers: user}},
function(err,group){
if(err){
console.log('update group err:' + err);
res.send(err);
}
else{
group.populate({path:'joinedUsers'},
function(err, group){
if(err){
console.log('populate group err');
res.send(err);
}
else{
console.log('populate group success');
res.json(group);
}
}
);
}
});
}
});
}
});
});
感觉很复杂,而且出现错误:
update group err:CastError: Cast to ObjectId failed for value "1" at path "joinedUsers"
所以我希望有人能帮助我找到正确的解决方案,谢谢!
编辑:
我还想支持将用户加入 PUT /api/group/:group_id 中的现有组,如下所示:
var userId = req.body.user_id;
var groupId = req.params.group_id;
怎么做?谢谢!
首先,你的实现很复杂,可以简化为:
var userId = req.body.user_id; // this is an ObjectId
var group = {
createdBy: userId,
joinedUsers: userId
};
Group.create(group, function (err, group) {
if (err || !group) {
return res.send(err);
}
User.findById(userId, function (err, user) {
if (err || !user) {
return res.send(err);
}
user.joinedGroups.push(group._id);
user.save(function (err) {
if (err) {
return res.send(err);
}
group.populate('joinedUsers', function (err, group) {
if (err || group) {
return res.send(err);
}
res.json(group);
});
});
});
});
而出现 CastError
错误的原因是:update
方法 returns 1
作为回调的第二个参数(如果更新成功)。但是您的 Group#joinedUsers
提交期望 User
参考。
我想要2个模型,一个是可以属于多个组的用户,另一个是可以有多个用户的组。 这是我的模式和模型,我不知道它们是否正确:
var Schema = mongoose.Schema;
var UserSchema = new Schema({
joinedGroups:[{type:Schema.Types.ObjectId, ref: 'Group'}]
}
);
var GroupSchema = new Schema({
createdBy: {type: Schema.Types.ObjectId, ref: 'User'},
joinedUsers:[{ type: Schema.Types.ObjectId, ref: 'User' }]
});
var User = mongoose.model('User',UserSchema);
var Group = mongoose.model('Group',GroupSchema);
当收到 url:/api/groups 的 POST 和 user._id 的正文时,我想将此用户加入新创建的组,此外,我想将这个新创建的组加入用户的 joinedGroups,最后我想用其中的用户响应新组的客户端。以下是我执行此操作的代码:
app.post('/api/groups', 函数(req, res){ console.log(req.body);
var userId = req.body.user_id;
var group = {
createdBy : userId
};
Group.create(group, function(err,group){
if(err){
console.log('create group err');
res.send(err);
}
else{
console.log('create group success');
User.update({_id: userId},
{$push: {joinedGroups: group._id}},
function(err,user){
if(err){
console.log('update user err');
res.send(err);
}
else{
Group.update({_id: group._id},
{$push: {joinedUsers: user}},
function(err,group){
if(err){
console.log('update group err:' + err);
res.send(err);
}
else{
group.populate({path:'joinedUsers'},
function(err, group){
if(err){
console.log('populate group err');
res.send(err);
}
else{
console.log('populate group success');
res.json(group);
}
}
);
}
});
}
});
}
});
});
感觉很复杂,而且出现错误:
update group err:CastError: Cast to ObjectId failed for value "1" at path "joinedUsers"
所以我希望有人能帮助我找到正确的解决方案,谢谢!
编辑: 我还想支持将用户加入 PUT /api/group/:group_id 中的现有组,如下所示:
var userId = req.body.user_id;
var groupId = req.params.group_id;
怎么做?谢谢!
首先,你的实现很复杂,可以简化为:
var userId = req.body.user_id; // this is an ObjectId
var group = {
createdBy: userId,
joinedUsers: userId
};
Group.create(group, function (err, group) {
if (err || !group) {
return res.send(err);
}
User.findById(userId, function (err, user) {
if (err || !user) {
return res.send(err);
}
user.joinedGroups.push(group._id);
user.save(function (err) {
if (err) {
return res.send(err);
}
group.populate('joinedUsers', function (err, group) {
if (err || group) {
return res.send(err);
}
res.json(group);
});
});
});
});
而出现 CastError
错误的原因是:update
方法 returns 1
作为回调的第二个参数(如果更新成功)。但是您的 Group#joinedUsers
提交期望 User
参考。