我是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);
});
})
这可行,但是我遇到的问题是:
我需要一种干净的方法来检查具有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);
因此,如果我分配/删除用户,则无需两次更新引用。