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