如何在CouchDB中创建视图按email统计所有文档数量(Node.js环境)
CouchDB 按email维度统计文档数量视图实现方案
Map 函数
仅需将每个文档的email作为键输出即可,值固定为1方便计数:
function(doc) { // 过滤无email字段的异常文档 if(doc.email) { emit(doc.email, 1); } }
Reduce 函数
直接使用CouchDB内置的_count函数即可,无需自定义编写,性能和稳定性均优于手写实现。
如果需要自定义实现reduce逻辑,可参考以下代码:
function(keys, values, rereduce) { return sum(values); }
正确查询方式
调用视图时必须添加group=true参数,才能得到按email分组的统计结果,不加该参数会直接返回所有文档的总计数。
以Node端常用的nano库调用为例:
// db为已完成初始化的CouchDB数据库实例 db.view('你的设计文档名', '你的视图名', { group: true }, (err, result) => { if(err) { console.error('查询失败', err); return; } // 遍历输出每个邮箱对应的文档数 result.rows.forEach(item => { console.log(`邮箱:${item.key},关联文档数:${item.value}`); }) })
常见错误排查
- 未添加
group=true查询参数:这是绝大多数分组统计类视图结果异常的原因 - map函数中emit了非email的字段作为第一个参数,导致分组维度错误
- 自定义reduce函数未处理rereduce场景,用内置
_count可完全规避该类问题
内容的提问来源于stack exchange,提问作者Michal Kubiak
相关产品推荐
相关产品推荐

