Как я могу отфильтровать записи, которые НЕ содержат пару ключ-значение во вложенном массиве - PullRequest
0 голосов
/ 11 января 2019

Допустим, у меня есть следующий вывод 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 запрос, чтобы получить все StackName s для стеков, которые НЕ имеют Tags значение "Key": "Joe Shmo"? Таким образом, результат будет возвращать просто hello-man.

Ответы [ 2 ]

0 голосов
/ 11 января 2019
.Stacks[]
| select( any(.Tags[]; .Key == "Joe Shmo" ) | not)
| .StackName

Это эффективно проверяет равенство (any имеет семантику короткого замыкания), тогда как contains будет проверять наличие.

0 голосов
/ 11 января 2019

Использование contains, например:

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

Примечание: -r удаляет кавычки из вывода, в противном случае jq напечатает "hello-man" (в двойных кавычках)

...