如何基于另一数组值筛选元素:MC级服务依赖关系查询
问题:找出特定关键级别的服务依赖关系
原始数据
{ "services": [ { "name": "B1", "criticality": "BC" }, { "name": "B2", "criticality": "BC" }, { "name": "M1", "criticality": "MC" }, { "name": "M2", "criticality": "MC" }, { "name": "M3", "criticality": "MC" }, { "name": "M4", "criticality": "MC" } ], "links": [ { "from_name": "B1", "to_name": "M1" }, { "from_name": "M1", "to_name": "M2" }, { "from_name": "M2", "to_name": "B2" }, { "from_name": "M1", "to_name": "M3" }, { "from_name": "M4", "to_name": "M2" } ] }
需求
找出所有criticality等于MC且依赖其他criticality等于MC的服务,输出格式如下:
{ "M1": [ "M2", "M3" ], "M4": [ "M2" ] }
尝试的错误代码
.links[] as $in | .services.[] | select(.name == $in.from_name) | select(.criticality == "MC")
错误执行结果
{ "name": "M1", "criticality": "MC" } { "name": "M2", "criticality": "MC" }
解决方案
可以通过以下jq命令实现需求:
# 构建MC服务的快速查询集合 ( .services | map(select(.criticality == "MC").name) | INDEX(.; .) ) as $mc_services # 筛选出两端都是MC级别的链接 | .links | map(select($mc_services[.from_name] and $mc_services[.to_name])) # 按来源服务分组,收集依赖的服务列表 | group_by(.from_name) | map({key: .[0].from_name, value: [.[].to_name]}) # 转换为目标对象格式 | from_entries
代码解释
- 构建MC服务集合:从
services中筛选出所有criticality为MC的服务名称,用INDEX生成以服务名为键的对象,方便后续快速验证服务级别。 - 筛选有效链接:遍历
links,只保留from_name和to_name都属于MC级别的链接。 - 分组收集依赖:将筛选后的链接按
from_name分组,每组收集对应的to_name组成列表。 - 转换为目标格式:通过
from_entries把分组后的键值对数组转换成最终的对象结构。
执行上述命令后,即可得到符合需求的输出结果。
内容的提问来源于stack exchange,提问作者Maxim Suslov
相关产品推荐
相关产品推荐

