如何使用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
相关产品推荐
相关产品推荐

