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

如何用jq查询嵌套JSON中指定keyspace对应的父级target DB

根据Keyspace查询对应的Target DB名称(基于jq)

需求背景

在NoSQL迁移场景中,使用嵌套JSON存储环境、Target DB与Keyspace的映射关系(结构:环境 >> [Target DB >> Keyspace列表]),需要根据指定的环境和Keyspace值,反向查询对应的Target DB名称。

示例JSON(env.json)

{
    "Prod": [
        {
            "prod1": [
                "prod_db1",
                "prod_db2",
                "prod_d31",
                "prod_db4"
            ]
        },
        {
            "prod2": [
                "prod_db5",
                "prod_db6",
                "prod_db7",
                "prod_db8"
            ]
        }
    ]
}

解决方案

使用jq的参数传递、条目转换和筛选功能实现精准查询,核心逻辑如下:

核心jq命令

jq --arg env "$ENV" --arg ks "$KEYSPACE" '.[$env][] | to_entries[] | select(.value[] == $ks) | .key' env.json

命令拆解

  • --arg env "$ENV"/--arg ks "$KEYSPACE":将Shell变量安全传入jq,避免字符串拼接导致的语法问题
  • .[$env][]:定位到指定环境下的所有Target DB对象数组
  • to_entries[]:将每个Target DB的键值对转换为{"key": "TargetDB名称", "value": ["Keyspace列表"]}的标准结构,便于后续筛选
  • select(.value[] == $ks):筛选出Keyspace列表包含目标值的条目
  • .key:提取最终的Target DB名称

完整Shell脚本示例

固定变量版本

#!/bin/bash

# 定义目标环境和Keyspace
ENV="Prod"
KEYSPACE="prod_db6"

# 执行查询并获取结果
TARGET_DB=$(jq --arg env "$ENV" --arg ks "$KEYSPACE" '.[$env][] | to_entries[] | select(.value[] == $ks) | .key' env.json)

# 输出结果
echo "对应的Target DB名称:$TARGET_DB"

命令行传参版本(更灵活)

#!/bin/bash

# 校验参数数量
if [ $# -ne 2 ]; then
    echo "用法: $0 <环境名称> <Keyspace名称>"
    exit 1
fi

# 接收命令行参数
ENV=$1
KEYSPACE=$2

# 执行查询
TARGET_DB=$(jq --arg env "$ENV" --arg ks "$KEYSPACE" '.[$env][] | to_entries[] | select(.value[] == $ks) | .key' env.json)

echo "对应的Target DB名称:$TARGET_DB"

注意事项

  • 确保jq已安装(可通过apt install jq或brew install jq完成安装)
  • 如果存在多个Target DB包含同一个Keyspace,该命令会返回所有匹配的名称(每行一个)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:05:29