Mongo聚合嵌套数组,查找

时间:2019-05-12 20:53:36

标签: mongodb go mgo

我正在使用MongoDB和Go创建一个Web应用程序,其中包括基于角色的访问控制。我将与此相关的信息存储在sessionInfo()permissions 2个集合中。

这是这两个集合的外观。 权限

roles

{ "operation": "create", "resource": "project" } { "operation": "read", "resource": "project" } { "operation": "update", "resource": "project" } { "operation": "delete", "resource": "project" } { "operation": "create", "resource": "user" } 是执行resource的对象。因此,如果某些操作无法在某些资源上执行,则无需存储它。例如,只能创建用户,因此仅需要存储operation create。 目前,在应用程序范围内只有4种操作(创建,读取,更新,删除),但可以增加,例如user可能会出现。

角色

upload

角色包含角色,要在UI上显示的角色名称以及该角色具有的权限集。

我需要使用REST API以特定格式将此信息发送到UI,该格式将描述特定角色是否可以使用{ "role": "admin", "display_name": "Administrator", "permissions": [ { "operation": "create", "resource": "project" }, { "operation": "read", "resource": "project" }, { "operation": "update", "resource": "project" }, { "operation": "delete", "resource": "project" } ] } 标志对资源执行操作,以及是否对通过使用标志checked,资源是否可编辑。 例如,权限集合不包含对资源用户的删除操作,因此它不应是可编辑的,因此将flag设置为false。同样,可以创建用户,因此将其设置为true。

isEditable

是否可以使用mongo聚合来执行此操作?还是我需要在架构中进行修改?如果是,那么我应该进行哪些修改。

1 个答案:

答案 0 :(得分:1)

我可以通过 3 个步骤解决问题:

  1. 包括每个角色的所有权限并添加一个名为 checked 的标志。这增加了数据冗余,但这不是大问题。
  2. group by 集合中的 resource 字段上执行 roles
  3. 在服务器端将 privileges 设置为 false,为每个 resource 填充缺失的 isEditable

我不得不在服务器端遍历数据,但这是我能想到的最有效的方法。