如何通过CouchDB的Map/Reduce统计唯一联系人总数?
嘿,我懂你的困扰!你想统计CouchDB里关联的唯一联系人总数,但用默认的_count归约函数只会返回所有记录的总数(比如你的案例里是5),而不是去重后的2,对吧?别慌,咱们用自定义的映射+归约函数就能搞定这个需求~
解决方案:统计CouchDB中唯一联系人总数
1. 编写自定义映射函数
首先,我们需要让映射函数把同一个联系人的所有记录都映射到同一个键,这里就用联系人的邮箱作为键。值可以随便设个null就行,因为我们只关心键的唯一性。
function(doc) { // 这里假设你的记录里存储联系人邮箱的字段是contact_email,记得换成你实际的字段名! if (doc.contact_email) { emit(doc.contact_email, null); } }
简单说:这个函数会遍历每条记录,只要它有联系人邮箱字段,就输出「邮箱为键,null为值」的键值对——这样相同邮箱的记录会被自动归为一组。
2. 选择合适的归约函数
这一步是关键!默认的_count会统计所有键值对的数量,而我们要的是不同键的数量,所以得换个归约方式:
选项A:用内置的_count_distinct函数
CouchDB其实自带了一个专门的去重计数归约函数_count_distinct,它会自动帮你统计唯一键的数量。你只需要在创建视图时,归约函数选择这个内置函数就行,不用自己写代码。
选项B:自定义归约函数(更灵活)
如果内置函数满足不了你的特殊需求,也可以自己写一个:
function(keys, values, rereduce) { if (rereduce) { // 合并各个子分组的计数结果 return sum(values); } else { // 每个邮箱分组只计1次(不管这个邮箱关联了多少条记录) return 1; } }
原理很简单:非重归约阶段,每个邮箱分组返回1;重归约阶段把所有分组的1加起来,得到的就是唯一联系人的总数。
3. 执行查询
创建好这个视图后,直接查询它就能得到结果啦!比如在Fauxton(CouchDB的可视化管理界面)里打开这个视图,你会看到返回的结果是2——正好是你案例里的唯一联系人总数。
为啥之前的_count不行?
默认的_count归约函数是统计所有输出的键值对总数,也就是你的5条记录,所以会返回5。而我们通过把相同邮箱映射到同一个键,再统计键的数量,就实现了去重计数的效果。
内容的提问来源于stack exchange,提问作者Aram
相关产品推荐
相关产品推荐

