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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 04:22:47