如何检测CouchDB的_find查询结束条件以终止遍历循环
CouchDB /_find 接口遍历终止方法
CouchDB 3.x版本的/_find接口设计逻辑就是无论是否还有剩余匹配文档,都会返回合法的bookmark值和200成功状态,因此不能通过bookmark有效性、请求状态码作为循环终止的判断条件,唯一可靠的判断依据是返回结果中docs数组的长度,当docs为空时,说明所有匹配文档已经遍历完成,直接终止循环即可。
调整后的示例代码
以常用的jqJSON处理工具为例,修改后的循环逻辑如下:
# 首次请求bookmark为空即可 b="" while true do resp=$(curl -s -X POST $dburl/db/_find -H "Content-Type: application/json" \ -d '{"selector":{你自己的查询条件},"bookmark":"'$b'"}') # 判断当前返回的文档数是否为0,为0直接跳出循环 doc_count=$(echo "$resp" | jq '.docs | length') if [ "$doc_count" -eq 0 ]; then break fi # 原有业务逻辑,比如保存结果、处理文档 echo "$resp" > result.dat # 提取下一页的bookmark b=$(echo "$resp" | jq -r '.bookmark') done
注意事项
- 如果是Windows原生PowerShell环境,无需安装
jq,可以直接用内置的ConvertFrom-Json命令解析返回结果,判断docs数组长度的逻辑完全一致。 - 可额外增加异常校验逻辑:先判断返回结果是否包含
docs字段,避免网络波动、参数错误导致的空响应触发误终止。 - 若需要双重校验,可在请求参数中添加
"execution_stats": true,通过返回的execution_stats.total_rows_match字段和已累加的文档总数做比对,确认遍历完成。
内容的提问来源于stack exchange,提问作者SiliconValley
相关产品推荐
相关产品推荐

