微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

多集合GraphLookup和加入

如何解决多集合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 举报,一经查实,本站将立刻删除。