我想要两种模型,一种是可以属于多个组的用户,另一种是可以拥有多个用户的组。这是我的架构和模型,我不知道它们是否正确:
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);
当收到主体为 user._id 的 url:/api/groups 的 POST 时,我想将此用户加入到新创建的组中,此外,我想将这个新创建的组加入到用户的 joinGroups 中,最后我想响应新组中包含用户的客户端。以下是我执行此操作的代码:
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
方法将返回 1
作为回调的第二个参数。但您的 Group#joinedUsers
提交时需要 User
引用。
我是一名优秀的程序员,十分优秀!