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

