You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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]
}

规则说明

  1. tenant_data := data["TENANT1"]:定位到目标租户的数据集
  2. site_data := tenant_data[_]:遍历租户下的所有站点数据
  3. device_name := site_data[_]:遍历每个站点下的所有设备名称
  4. device_types := site_data[device_name]:获取当前设备对应的类型列表
  5. 最终将设备名称作为键、类型列表作为值存入test对象,实现所有设备在同一层级展示

测试结果

执行上述规则后,将得到符合预期的输出:

{
  "test": {
    "SITE1_DEVICE1": ["TEMP", "SET", "HUM"],
    "SITE1_DEVICE2": ["TEMP"],
    "SITE2_DEVICE1": ["TEMP", "HUM"]
  }
}

内容的提问来源于stack exchange,提问作者Martin Hoang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 17:45:14