cloudant index:计算每个时间段的唯一用户数

时间:2015-10-08 02:57:25

标签: mapreduce lucene couchdb cloudant nosql

关于此问题here的帖子非常相似。在cloudant中,我有一个存储用户访问应用程序时的文档结构,如下所示:

{"username":"one","timestamp":"2015-10-07T15:04:46Z"} --- |同一天 {"username":"one","timestamp":"2015-10-07T19:22:00Z"} --- ^
{"username":"one","timestamp":"2015-10-25T04:22:00Z"}
{"username":"two","timestamp":"2015-10-07T19:22:00Z"}

我想知道的是计算给定时间段内的唯一身份用户数。例如:

2015-10-07 = {"count": 2} 2015-10-07访问的两个不同用户
2015-10-25 = {"count": 1} 在2015-10-25访问的另一位用户
2015 = {"count" 2} 2015年访问的两个不同用户

这一切都变得棘手,因为例如在2015-10-07,用户名:一个有两个记录他们何时访问,但它应该只返回1到唯一的总数用户。

我试过了:

function(doc) {
    var time = new Date(Date.parse(doc['timestamp'])); 
    emit([time.getUTCFullYear(),time.getUTCMonth(),time.getUTCDay(),doc.username], 1);
}

这有几个问题,耶稣阿尔瓦强调了我在上面链接的帖子中发表的评论。

谢谢!

1 个答案:

答案 0 :(得分:1)

这可能是一种更好的方式,但是我不知道......

您可以尝试为每个粒度级别发出索引:

function(doc) {
    var time = new Date(Date.parse(doc['timestamp'])); 
    var year = time.getUTCFullYear();
    var month = time.getUTCMonth()+1;
    var day = time.getUTCDate();

    // day granularity
    emit([year,month,day,doc.username], null);

    // year granularity
    emit([year,doc.username], null);
}

// reduce function - `_count`

日查询(2015-10-07):

inclusive_end=true&
start_key=[2015, 10, 7, "\u0000"]&
end_key=[2015, 10, 7, "\uefff"]&
reduce=true&
group=true

日查询结果 - 您的应用程序代码将计算行数:

{"rows":[
  {"key":[2015,10,7,"one"],"value":2},
  {"key":[2015,10,7,"two"],"value":1}
]}

年度查询:

inclusive_end=true&
start_key=[2015, "\u0000"]&
end_key=[2015, "\uefff"]&
reduce=true&
group=true

查询结果 - 您的应用程序代码将计算行数:

{"rows":[
  {"key":[2015,"one"],"value":3},
  {"key":[2015,"two"],"value":1}
]}