获取 CouchDB 中 mapped/reduced 条记录的总数

Getting total count of mapped/reduced records in CouchDB

couch 中的数据对每种联系人类型都有如下记录。

[{
  "_id":"1"
  "contact_type":"AA"
  "contact_email" : "userA@domain.com"
},{
  "_id":"2"
  "contact_type":"BB"
  "contact_email" : "userA@domain.com"
},{
  "_id":"3"
  "contact_type":"CC"
  "contact_email" : "userA@domain.com"
},{
  "_id":"4"
  "contact_type":"AA"
  "contact_email" : "userB@domain.com"
},
{
  "_id":"5"
  "contact_type":"BB"
  "contact_email" : "userB@domain.com"
}]

Records 1,2,3 represent contact with the email userA@domain.com while records 4 and 5 represent contact with an email userB@domain.com.

我的任务是构建查询以获取唯一联系人的总数(在本例中为 2 个),但我不确定如何实现。

目前,我有一个带有 _count reduce 的地图函数

function(doc){
  emit(doc.emailAddress, 1);
}

哪个returns

{
  "rows":
    {
      "key" : "userA@domain.com",
      "value" : 3
    },
    {
      "key" : "userA@domain.com",
      "value" : 2
    }
}

但是,我需要的是上面那些记录的总量,比如

{
  "total" : 2
}

(注意:数据库很大,所以循环遍历 mapped/reduced 视图来计算记录不是一个选项)

将 reduce 函数设置为 _count,它应该会执行您想要的操作。

在您的情况下,您也可以使用 _sum。

您可以使用此 post

中描述的方法

1.- 按照您在问题中的描述定义一个视图(即命名为 "emails")

2.- 定义一个列表函数(在我的示例中名为 "count")

function(head,req){
 var count = 0;
 while(getRow()) count++;
 return JSON.stringify({total: count});
}

假设您的设计文档被命名为 "users",您可以使用带有此 URL 的列表函数转换视图结果。

http://.../db/_design/users/_list/count/emails?group=true

您应该得到不同的值计数作为结果。