如果多个键具有指定值,则使用 jq return 布尔值

use jq to return a boolean if more than one key has a specified value

我有一个 JSON 斑点。它包含要处理的项目队列。我正在使用 jq 来过滤它。此队列中的每个对象都有键 downloadId。我可以 return 对象列表,其中 downloadId 具有此过滤器的特定值:

.[] | select((.downloadId) == "ABCA01479FCAB77D0A8A5C499D5ABAA147E97B47")

但我真正需要的是一个布尔值,如果队列中有多个对象具有 downloadId 的值,它将 return true。我一直在查看 jq 手册,但我不太确定该怎么做。我可以尝试使用 any

any(.[]; .downloadId == "ABCA01479FCAB77D0A8A5C499D5ABAA147E97B47")

但是如果该值只有一个实例,则 return 为真。

这是一个 blob:

[
  {
    "sizeleft": 805679928.0,
    "timeleft": "00:00:00",
    "estimatedCompletionTime": "2019-05-03T17:30:31.370856Z",
    "status": "Paused",
    "trackedDownloadStatus": "Ok",
    "statusMessages": [],
    "downloadId": "1C2DE46A5B4258BE7AC47FEFAE71432897417126",
    "id": 1065601863
  },
  {
    "sizeleft": 836459293.0,
    "timeleft": "00:00:00",
    "estimatedCompletionTime": "2019-05-03T17:30:31.370864Z",
    "status": "Paused",
    "trackedDownloadStatus": "Ok",
    "statusMessages": [],
    "downloadId": "728084A13FD172FED437C6AE503A8CF4A8D317AE",
    "id": 1177597916
  },
  {
    "sizeleft": 836459293.0,
    "timeleft": "00:00:00",
    "estimatedCompletionTime": "2019-05-03T17:30:31.370864Z",
    "status": "Paused",
    "trackedDownloadStatus": "Ok",
    "statusMessages": [],
    "downloadId": "ABCA01479FCAB77D0A8A5C499D5ABAA147E97B47",
    "id": 1177597916
  }
]

为了实现高效的解决方案,让我们定义 repeated/2 来检查给定值是否在流中出现多次:

def repeated(stream; $value):
  label $done
  | foreach stream as $x (0;
       if $x == $value then  . + 1 else . end;
       if . == 2 then true, break $done else empty end)
  // false;

这里的关键当然是在第二次遇到该值时跳出循环。

解决方案

根据以上内容,解决方案是:

repeated(.[] | .downloadId; "ABCA01479FCAB77D0A8A5C499D5ABAA147E97B47")