CouchDB中的SELECT COUNT(DISTINCT *)

时间:2016-02-07 21:54:27

标签: mapreduce couchdb nosql

我的文件符合以下格式:

{
  "_id": "some_doc_id", 
  "user": "some_user_id", 
  "date": "2015-09-15",
  …
}

可以使用同一个用户拥有多个文档。我想计算两个日期之间有多少不同的用户。例如。在'2015-09-15'和'2015-09-25之间,有745个不同的用户。

在SQL中,我会写这个查询:

SELECT COUNT(DISTINCT user)
FROM documents
WHERE date BETWEEN '2015-09-15' and '2015-09-25' 

谢谢。

1 个答案:

答案 0 :(得分:2)

我会使用地图函数,如:

function (doc) {
  emit(doc.date, doc.user);
}

将按日期排序文档,用户为值。 reduce函数如下所示:

function(keys, values, rereduce) {
  if (rereduce) {
    return values.reduce(function (acc, index) {
      return Object.keys(index).reduce(function (acc, user) {
        acc[user] = (acc[user] || 0) + index[user];
        return acc;
      }, acc);
    }, {});
  } else {
    return values.reduce(function (acc, user) {
      if (!(user in acc)) acc[user] = 0;
      acc[user]++;
      return acc;
    }, {});
  }
}

这是一个自定义缩小功能,所以请耐心等待我的简要说明。正常情况(第二个分支,而不是rereduce)基本上会计算它找到的值。结果是像{ some_user_id: 1 }

这样的对象

rereduce分支基本上采用了几个简化对象,并将它们(及其计数)合并为1个简化结果。 (您可以阅读有关减少和重新减少here

的更多信息

从那里,您可以使用以下查询参数查询您的视图:

start_key="2015-09-15"
end_key="2015-09-25"

您最终会得到与前面所示相同的结果。 (即:{ some_user_id: 1 })在您的客户端上,您可以对结果对象中的键进行计数,以了解任何给定日期范围内有多少个唯一身份用户。