您可以检查团队是否包含在对象中,如下所示:
data.teams[input.team]
在您的原始示例中,您编写了data.teams[_] == input.name
. 这有两个问题:
- 当您将变量(
_
是像 Go 一样的唯一变量)插入引用时,OPA 会找到使查询为真的变量的赋值,即,它将扫描数组/引用/对象并查找匹配项。如果您给出变量名称,这将变得更加明显:
some key
data.teams[key]
在此查询中,OPA 将找到“key”的两个结果:
# Result 1
key = "t1"
# Result 2
key = "t2"
- 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/