获取CouchDB中

时间:2018-02-05 18:22:13

标签: mapreduce couchdb couchdb-futon

沙发中的数据具有每种联系类型的记录,如下所示。

[{
  "_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"
}]
  

记录1,2,3代表与电子邮件userA@domain.com的联系   记录4和5表示与电子邮件userB@domain.com的联系。

我的任务是构建一个查询来获取唯一联系人的总数(在这种情况下为2),但我不确定如何实现这一目标。

目前,我有一个带_count reduce

的地图功能
function(doc){
  emit(doc.emailAddress, 1);
}

返回

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

但是,我需要的是上述记录的总量,即

{
  "total" : 2
}

注意:数据库很大,因此循环遍历映射/缩小视图以计算记录不是一个选项

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

Yo可以使用此post

中描述的方法

1.-定义您在问题中描述的视图(即命名为“电子邮件”)

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

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

假设您的设计文档名为“users”,您可以使用带有此URL的list函数转换视图结果。

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

你应该得到不同的值计数结果。