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

如何在Shell脚本中遍历MongoDB find查询结果?循环仅识别单元素

问题解决:Shell遍历MongoDB查询结果时仅识别单个元素的修复方法

问题原因

你通过$(...)获取的ele是单个完整的JSON字符串,并非Shell数组。for i in "${ele[@]}"本质上是把整个JSON数组当作一个元素处理,所以循环只会执行一次。

解决方案

使用jq工具(专门处理JSON的命令行工具,需提前安装)来拆分JSON数组,实现单个文档的遍历,以下是两种可靠实现方式:

方式一:直接逐行读取单个文档

# 执行MongoDB查询,用jq拆分数组为每行一个文档,再循环处理
mongo ${DATABASE_NAME} --quiet --eval 'printjson(db.'${COLLECTION_NAME}'.find({"status":1},{"_id": 1, "setId": 1}).toArray())' | jq -c '.[]' | while read -r doc
do
    echo "$doc"
    # 可在此添加单个文档的处理逻辑,比如提取字段:
    # set_id=$(echo "$doc" | jq -r '.setId')
    # object_id=$(echo "$doc" | jq -r '._id.$oid')
done
  • jq -c '.[]':将JSON数组拆分为每行一个紧凑格式的JSON文档
  • while read -r doc:逐行读取每个文档,确保每次循环处理单个MongoDB文档

方式二:先将文档存入Shell数组再遍历

# 用jq拆分查询结果,将每个文档存入Shell数组
mapfile -t docs < <(mongo ${DATABASE_NAME} --quiet --eval 'printjson(db.'${COLLECTION_NAME}'.find({"status":1},{"_id": 1, "setId": 1}).toArray())' | jq -c '.[]')

# 遍历数组处理单个文档
for doc in "${docs[@]}"
do
    echo "$doc"
done
  • mapfile -t docs:将jq输出的每行内容(单个文档)存入数组docs
  • "${docs[@]}":遍历数组时,每个元素对应一个独立的MongoDB文档

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 04:07:19