jq: select 仅包含元素 A 但不包含元素 B 的数组

jq: select only an array which contains element A but not element B

我的数据是一系列 JSON 数组。每个数组都有一个或多个带有 name 和 id 键的元素:

[
  {
    "name": "first_source",
    "id": "abcdef"
  },
  {
    "name": "second_source",
    "id": "ghijkl"
  },
  {
    "name": "third_source",
    "id": "opqrst"
  }
]

我如何使用 jq select 仅包含一个元素的数组 "first source" 作为名称值,但不包含 "second_source" 作为名称值任何元素?

这只有 return 一个 元素 需要进一步处理:

jq '.[] | select (.name == "first_source") 

但我显然需要 return 整个阵列才能使我的场景正常工作。

您可以使用这个过滤器:

select(
    (map(.name == "first_source") | any) and
    (map(.name != "second_source") | all)
)

您需要测试数组的所有元素是否存在名称。您可以通过将每个对象映射到您的条件并适当地使用 anyall 过滤器来做到这一点。

在这里,您想查看是否有任何项目被命名为 "first_source" 而所有项目都没有被命名为 "second_source"