gpt4 book ai didi

mongodb - 在 MongoDB 中插入时如何检查引用?

转载 作者:可可西里 更新时间:2023-11-01 10:27:22 24 4
gpt4 key购买 nike

假设我有用户和角色。每个用户都属于一个角色。我想像这样设计数据库:

收藏用户:

{
"name":"user1"
"role":"admin"
}

集合角色:

{
"name":"admin"
"privileges":[]
}
{
"name":"user"
"privileges":[]
}

稍后我可以为任何角色添加更多角色或编辑权限。

我的问题是:当我插入一个新用户时,如何检查“角色”字段是否具有有效值(这意味着角色集合中有匹配文档)?

我应该在应用程序中检查此引用吗?有没有办法在 mongodb 服务器端这样做?

假设编辑权限是一项频繁的操作。

最佳答案

我认为您是本末倒置。

要对数据建模,您现在首先应该对数据提出什么问题。至于用户、角色和权限关系,问题很明显

For a given user, what are the privileges?

只要每个角色的权限不超过几十万,你的角色模型应该比较简单

{
_id: "roleName",
description: "a role",
privileges:[
"someService:someAction:someInstance",
]
},
{
_id: "admin",
description: "Administrator",
privileges:[
"adminService:*:*",
]
}

我们有一个具有简化模型的给定用户

{
_id: "foo",
roles: ["roleName","admin"]
}

为了获得给定用户“foo”的权限(您之前已作为用户加载),我们做类似的事情

var user_privileges = db.roles.aggregate([
{ $match:{ _id:{ $in: user.roles} } },
{ $unwind: "$privileges" },
{ $group:{ _id: null, $push:{ "forAllRoles": "$privileges" } }
]}

这应该会产生类似这样的结果文档

{ _id: null, forAllRoles:[
"adminService:*:*",
"someService:someAction:someInstance"
]
}

现在检查权限变得容易

var permission_needed = "adminService:*:*"

if(user_privileges.forAllRoles.indexOf(permission_needed) > -1){
console.log("Yay, admin!");
doSomeAdminStuff();
} else {
console.log("Don't you dare again, user!");
}

由于我们通过索引的 roles._id 查找权限,因此聚合应该非常有效,因为我们在处理之前将文档限制在很少的范围内。

如果你想为角色添加权限,这很简单

db.roles.update(
{ _id: "roleName" },
{ $addToSet: { privileges: [ "otherService:*:someInstance" ] } }
)

第一个

关于mongodb - 在 MongoDB 中插入时如何检查引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32546769/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com