jq-过滤JSON数组(如果不包含则不工作)

jq-过滤JSON数组(如果不包含则不工作),json,parsing,jq,Json,Parsing,Jq,解析JSON文件时遇到问题,我想从中提取不包含字符串“to Do”作为标签的元素 这是我试图解析的文件 [ { "id": 1, "title": "Task A", "labels": [ "Low", "To Do" ] }, { "id": 2, "title": "Task B", "labels": [ "Medium", "Done" ] }, {

解析JSON文件时遇到问题,我想从中提取不包含字符串“to Do”作为标签的元素

这是我试图解析的文件

[
  {
    "id": 1,
    "title": "Task A",
    "labels": [
      "Low",
      "To Do"
    ]
  },
  {
    "id": 2,
    "title": "Task B",
    "labels": [
      "Medium",
      "Done"
    ]
  },
  {
    "id": 3,
    "title": "Task C",
    "labels": [
      "High",
      "To Do"
    ]
  }
]
我可以使用以下命令成功提取包含“To Do”的元素:

$ cat tmp.json | jq 'keys[] as $k | select(.[$k].labels[] | contains("To Do")) | "\(.[$k].id) -- \(.[$k].title) -- \(.[$k].labels)"'
"1 -- Task A -- [\"Low\",\"To Do\"]"
"3 -- Task C -- [\"High\",\"To Do\"]"
但是,当我否定条件时,jq具有以下行为:

$ cat tmp.json | jq 'keys[] as $k | select(.[$k].labels[] | contains("To Do") | not) | "\(.[$k].id) -- \(.[$k].title) -- \(.[$k].labels)"'
"1 -- Task A -- [\"Low\",\"To Do\"]"
"2 -- Task B -- [\"Medium\",\"Done\"]"
"2 -- Task B -- [\"Medium\",\"Done\"]"
"3 -- Task C -- [\"High\",\"To Do\"]"
这里唯一的区别是条件的否定,但是所有三个元素都被打印,我想过滤的元素被打印两次


谢谢。

对于这样一个琐碎的任务,您的查询似乎有点过于复杂(我没有调试,但您可能在那里误用了
contains
;我怀疑它针对每个数组元素运行,而不是针对数组本身运行一次)

无论如何,这里有一个简洁明了的方法:

.[] | select(.labels | index("To Do") | not) | "\(.id) -- \(.title) -- \(.labels)"

顺便说一句,

我会选择
all(;!=“To Do”)

.[] 
| select( all(.labels[]; . != "To Do"))
|  "\(.id) -- \(.title) -- \(.labels)"