如何过滤嵌套数组中不包含键值对的条目

时间:2019-01-11 00:46:26

标签: json select jq negation

假设我有以下JSON输出:

{
 "Stacks": [
        {
            "StackName": "hello-world",
            "Tags": [
                {
                    "Key": "environment",
                    "Value": "sandbox"
                },
                {
                    "Key": "Joe Shmo",
                    "Value": "Dev"
                }
            ]
        },
        {
            "StackName": "hello-man",
            "Tags": [
                {
                    "Key": "environment",
                    "Value": "live"
                },
                {
                    "Key": "Tandy",
                    "Value": "Dev"
                }
            ]
        }
    ]
}

我如何编写jq查询以获取所有{em> NOT 的StackName值为Tags的堆栈的所有"Key": "Joe Shmo"?因此结果将仅返回hello-man

2 个答案:

答案 0 :(得分:1)

.Stacks[]
| select( any(.Tags[]; .Key == "Joe Shmo" ) | not)
| .StackName

这将有效地检查是否相等(any具有短路语义),而contains将检查是否包含。

答案 1 :(得分:0)

使用contains,如下所示:

jq -r '.Stacks[]|select(.Tags|contains([{"Key": "Joe Shmo"}])|not).StackName'

注意:-r从输出中删除引号,否则jq将打印"hello-man"(在双引号内)