多集合GraphLookup和加入

问题描述

假设我在IAM数据库中有三个集合。

iam.policies iam.resourceHierarchy iam.roles

这些集合中的文档结构建模如下:

iam.policies-包含定义一个或多个成员对给定资源具有哪些权限或权限集合(角色)的文档。每个文档的结构如下:

{
  'resourceID': string
  'bindings': [
    {'members': [string],'permissions': [string]},{'members': [string],'role': ObjectId('<uuid>')}
  ]
}

例如

{
  'resourceID': 'program1','bindings': [
    {'members': ['user/user1@example.com'],permissions: ['projects.view']},{'members': ['user/user2@example.com'],role: ObjectId('role1')}
  ]
}

绑定中的role字段引用了iam.roles集合中定义的角色。

iam.resourceHierarchy-包含用于定义给定资源的祖先关系的文档。每个文档的结构如下:

{
  'resourceID': string
  'parentID': string
}

例如

[
  {
    'resourceID': 'program1'
  },{
    'resourceID': 'project1','parentID': 'program1'
  }
]

iam.roles-包含定义系统中存在的角色的文档。角色只是权限列表顶部的命名抽象。此集合中的每个文档代表一个角色。例如

{
   'title': string
   'includedPermissions': [string]
}

例如

{
  'title': 'Program Manager','includedPermissions': ['programs.view','programs.edit','projects.view','projects.edit']
}

要做的是递归查找给定resourceID的祖先链,并为每个祖先(包括resourceID本身)获取策略(例如,来自iam.policies个文档)并将它们合并在一起。

我使用了$graphLookup函数获取祖先链

db.resourceHierarchy.aggregate( [
   {
      $graphLookup: {
         from: "resourceHierarchy",startWith: "$resourceID",connectFromField: "parentID",connectToField: "resourceID",as: "ancestors"
      }
   }
] )

然后成功返回祖先链。使用上面的示例,我将获得项目1的以下输出

{
  'resourceID': 'project1','parentID': 'program1','ancestors': [
    {'resourceID': 'program1'},{'resourceID': 'project1','parentID': 'program1'}
  ]
}

但是我接下来该怎么办。现在,作为汇总的一部分,最好的方法是为bindings集合中的每个祖先查找iam.policies

我已经研究了$lookup函数,但无法使其正确加入策略集合的bindings字段中。

{
  'from': 'policies','startWith': '$resourceID','connectFromField': 'ancestors.resourceID','connectToField': 'bindings','as': 'bindings'
}

输出(例如对于项目1)

{
  'resourceID': 'project1','parentID': 'program1'}
  ],'bindings': []
}

有人对此有任何建议或很好的例子吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)