1

说我有数据:

> data
{
   "teams": {
      "t1": {
         "count": 1
      },
      "t2": {
          "count": 2
      }
   }
}

输入就像:

{
   "input": {"team": "t1"}
}

我想要一个规则来检查输入团队是否存在:

team_exists {
  data.teams[_] == input.name # this doesn't work, because data.teams[_] returns team values
}

怎么做?

4

1 回答 1

3

您可以检查团队是否包含在对象中,如下所示:

data.teams[input.team]

在您的原始示例中,您编写了data.teams[_] == input.name. 这有两个问题:

  1. 当您将变量(_是像 Go 一样的唯一变量)插入引用时,OPA 会找到使查询为真的变量的赋值,即,它将扫描数组/引用/对象并查找匹配项。如果您给出变量名称,这将变得更加明显:
some key
data.teams[key]

在此查询中,OPA 将找到“key”的两个结果:

# Result 1
key = "t1"

# Result 2
key = "t2"
  1. RHS 应该input.team不是input.name。后者缺失/未定义。如果您改为编写data.teams[input.name](注意:input参考不正确),则查询将未定义,因为input.name不存在。

通常,您可以使用相同的语法对对象、数组和集合执行查找:

some_arr := ["foo", "bar", "baz"]
some_arr[1] == "bar"

some_obj := {"foo": "bar", "baz", "qux"}
some_obj["baz"] == "qux"

some_set := {"foo", "bar", "baz"}
some_set["bar"] == "bar" # sets behave like objects where the keys==values

有关其他常见操作,请参阅此备忘单:https ://www.openpolicyagent.org/docs/latest/policy-cheatsheet/

于 2019-12-05T12:36:14.427 回答