OPA REGO拆解嵌套数组:将多站点设备合并至同一层级
OPA REGO 规则实现:合并多站点设备到同一层级
问题描述
现有嵌套结构的租户-站点-设备数据如下:
{ "TENANT1":{ "SITE1":{ "SITE1_DEVICE1":[ "TEMP", "SET", "HUM" ], "SITE1_DEVICE2":[ "TEMP" ] }, "SITE2":{ "SITE2_DEVICE1":[ "TEMP", "HUM" ] } } }
需求是列出指定租户(如TENANT1)的所有设备及其类型,且所有设备合并到同一层级,而非按站点划分。
尝试了以下REGO规则:
test[devices] { devices = data["TENANT1"][_] }
得到的结果是按站点分组的设备列表:
{ "test":[ { "SITE1_DEVICE1":["TEMP","SET","HUM" ], "SITE1_DEVICE2":["TEMP"] }, { "SITE2_DEVICE1":["TEMP","HUM"] } ] }
期望得到所有设备在同一层级的结果(注:原期望结果的JSON语法有误,修正为符合规范的对象格式):
{ "test": { "SITE1_DEVICE1":["TEMP","SET","HUM" ], "SITE1_DEVICE2":["TEMP"], "SITE2_DEVICE1":["TEMP","HUM"] } }
解决方案
使用嵌套遍历的REGO规则,直接提取每个设备名和对应的类型,跳过站点层级的分组:
test[device_name] = device_types { tenant_data := data["TENANT1"] site_data := tenant_data[_] device_name := site_data[_] device_types := site_data[device_name] }
规则说明
tenant_data := data["TENANT1"]:定位到目标租户的数据集site_data := tenant_data[_]:遍历租户下的所有站点数据device_name := site_data[_]:遍历每个站点下的所有设备名称device_types := site_data[device_name]:获取当前设备对应的类型列表- 最终将设备名称作为键、类型列表作为值存入
test对象,实现所有设备在同一层级展示
测试结果
执行上述规则后,将得到符合预期的输出:
{ "test": { "SITE1_DEVICE1": ["TEMP", "SET", "HUM"], "SITE1_DEVICE2": ["TEMP"], "SITE2_DEVICE1": ["TEMP", "HUM"] } }
内容的提问来源于stack exchange,提问作者Martin Hoang
相关产品推荐
相关产品推荐

