JQ中NOT IN查询结果异常及重复结果去重问题咨询
JQ查询问题及解决方案
数据
[ { "NetworkInterfaces": [ { "NetworkInterfaceId": "eni-1" }, { "NetworkInterfaceId": "eni-2" } ], "InstanceId": "i-1" }, { "NetworkInterfaces": [ { "NetworkInterfaceId": "eni-3" }, { "NetworkInterfaceId": "eni-4" } ], "InstanceId": "i-2" }, { "NetworkInterfaces": [ { "NetworkInterfaceId": "eni-5" }, { "NetworkInterfaceId": "eni-6" } ], "InstanceId": "i-3" } ]
JQ查询情况
正常查询:
执行语句:.[] | select(.["NetworkInterfaces"] | .[] | select(.["NetworkInterfaceId"] | IN("eni-1", "eni-3"))) | .["InstanceId"] // empty返回结果:
"i-1" "i-2",结果符合预期。未解决问题(Issue 1):
原NOT IN逻辑语句:.[] | select(.["NetworkInterfaces"] | .[] | select(.["NetworkInterfaceId"] | IN("eni-1", "eni-3") | not)) | .["InstanceId"] // empty返回结果:
"i-1" "i-2" "i-3" "i-3",不符合预期,期望仅返回"i-3"。修正后的语句:
.[] | select(.NetworkInterfaces | all(.NetworkInterfaceId | IN("eni-1", "eni-3") | not)) | .InstanceId // empty说明:原语句只要实例存在任意一个不在目标列表的网卡就会被选中,导致重复和错误结果。使用
all()函数可以确保实例的所有网卡ID都不属于["eni-1", "eni-3"],从而精准筛选出仅i-3实例。已解决问题(Issue 2):
原查询语句:.[] | select(.["NetworkInterfaces"] | .[] | select(.["NetworkInterfaceId"] | IN("eni-1", "eni-2"))) | .["InstanceId"] // empty返回重复结果:
"i-1" "i-1"。已修正语句:
.[] | first(select(.["NetworkInterfaces"] | .[] | select(.["NetworkInterfaceId"] | IN("eni-1", "eni-2")))) | .["InstanceId"] // empty返回唯一结果:
"i-1",问题解决。
内容的提问来源于stack exchange,提问作者Nam Nguyen
相关产品推荐
相关产品推荐

