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

