如何在猫鼬多对多关系中建模和保存?

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 参考。