猫鼬:建模和更新多对多

时间:2018-10-06 11:29:12

标签: node.js mongodb mongoose

我是mongodb和mongoose的新手,我想知道如何处理多对多关系。我知道mongodb是一个非关系型数据库,但是我将如何为用户和组之类的模型建模。 一个用户可以加入多个组,而一个组可以有多个用户。

我的模式如下:

用户

const UserSchema: Schema = new Schema({
    username: {
        type: String,
        required: true,
        unique: true,
    },  
    groups: [
        {
            type: Schema.Types.ObjectId,
            ref: 'Group',
        },
    ],
});

const GroupSchema: Schema = new Schema({    
    name: {
        type: String,
        required: true
    },
    users: [
        {
            type: Schema.Types.ObjectId,
            ref: 'User',
        },
    ],
});

因此,对于像'users /:id / assigngroup /:groupid这样的端点,我想向User.groups添加一个User_id,向Group.users添加一个groupid。

对于我的端点,我会执行以下操作:

User.findOneAndUpdate({ _id }, { $addToSet: { groups: groupId } }, { new: true }).populate('groups').exec((err, user) => {            
     Group.findOneAndUpdate({ _id: groupId }, { $addToSet: { users: _id } }, { new: true }).exec((err, group) => {                
         res.send(user);
    });
})

这可行,但是我遇到的问题是:

  • 即使具有该ID的组不存在,我仍然可以向User.users添加一个groupId。我可以在User.findOneAndUpate之前再添加一个Group.findOne()来检查它,但是这似乎不是猫鼬中最好/最快的方法。
  • 如果例如findOneAndUpdate之一失败,应如何处理回滚?

我需要一种干净的方法来检查具有groupid的组是否存在,然后检查具有_id的用户是否存在,然后我可以将groupid添加到User.groups并将_id添加到Group.users(以及当然无法多次添加相同的ID)。最好的方法是什么?每次检查都使用findOne / findOneUpdate多次,感觉不正确。

请让我知道我对这种“关系”进行建模的方法是否完全错误。

谢谢! :)

编辑:我认为这不是在两个模型中保存参考的明智方法。我从用户模型中删除了组。所以要分配一个用户,我只是使用

Group.findOneAndUpdate({ _id: groupId }, { $addToSet: { users: _id } }, { new: true }).populate('users', '_id username').exec().then(group => {  });

获取用户所有组的简单方法是

Group.find({
        "users": new Types.ObjectId(id)
    }).exec(callback);

因此,如果我分配/删除用户,则无需两次更新引用。

0 个答案:

没有答案
相关问题