You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用JQ选择子节点匹配双值条件的记录

需求与问题

需要从给定的JSON数据中提取满足**Tags数组中存在Key为"name"且对应Value为"uiop"**的记录的RecType字段值。

示例JSON数据:

{
  "Records": [
    {
      "RecType": "type-A",
      "Tags": [
        {
          "Key": "category",
          "Value": "foo"
        },
        {
          "Key": "name",
          "Value": "qwerty"
        }
      ]
    },
    {
      "RecType": "type-B",
      "Tags": [
        {
          "Key": "category",
          "Value": "bar"
        },
        {
          "Key": "name",
          "Value": "uiop"
        }
      ]
    }
  ]
}

尝试的命令及问题:
使用以下命令时,返回了两条记录的RecType,不符合预期——因为该命令只是分别检查记录是否存在Key为"name"的标签、是否存在Value为"uiop"的标签,而非检查同一个标签对象中同时满足Key="name"且Value="uiop":

jq ".Records[] | (select(.Tags[].Key==\"Name\")) 
               | (select(.Tags[].Value==\"uiop\"))" 
               | jq ".RecType" 

尝试用and连接两个select语句,结果只返回布尔值,无法得到目标记录。

解决方案

使用any()函数配合条件判断,检查Tags数组中是否存在同时满足Key=="name"和Value=="uiop"的标签对象,再筛选出符合条件的记录并提取RecType:

jq '.Records[] | select(any(.Tags[]; .Key == "name" and .Value == "uiop")) | .RecType'

解释

  • any(.Tags[]; 条件):遍历Tags数组中的每个对象,只要有一个对象满足指定条件,就返回true,此时select()会保留该记录。
  • 条件.Key == "name" and .Value == "uiop"确保是同一个标签对象同时匹配Key和Value,而非分别匹配不同标签。

另外注意原命令中的"Name"是大写,而JSON里是小写的"name",大小写不匹配也可能导致逻辑错误,需要保持一致。

内容的提问来源于stack exchange,提问作者bjb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 08:54:56