Couchbase独特用户每天/每月等数量

时间:2013-12-24 14:18:23

标签: count mapreduce unique couchbase

我是CouchBase和Map / reduce逻辑的新手。我想要创建的是一个视图,我可以看到每天/每月/每年/每小时和每天/每月/每年的独特用户

例如,假设我们插入了以下JSON文档:

{
  uid:"user1",
  time: "2013/12/24 18:45"
  city:"London"
  event:"open"
},

{
  uid:"user1",
  time: "2013/12/24 18:46"
  city:"London"
  event:"open"
},

{
  uid:"user2",
  time: "2013/12/24 18:46"
  city:"London"
  event:"open"
}

所以我想要的结果是:

{time:"2013-12-24 18:45", count:1}
{time:"2013-12-24 18:46", count:2}
{time:"2013-12-24 18", count:2} // user1 is considered as uniqu within the hour and counted once

我尝试了以下内容:

地图

function (doc, meta) {
     // date of document   
     var date = new Date(doc.time);

     // Granularity   
     var day = date.getDate();
     var month = date.getMonth();
     var year = date.getFullYear();
     var hour = date.getHours();
     var min = date.getMinutes();

     emit([year, month, day, hour, min], {user: doc.uid, count:1});   
     emit([year, month, day, hour], {user:doc.uid, count:1});   
}

减少

function(key, values, rereduce){
  if(rereduce) return;

  var users = {user: "", count: 0 };

  values.forEach(function(v) {
    for(var k in v) {
      if(!users[k])
        users[k] = 0

      users[k] += v[k];
    }
  });

  return(users);

}

我有两个问题:

当我在开发模式中运行时,一切正常,我得到了以下结果(跳过一些行来结果化):

{"rows":[
{"key":[2013,11,19,18],"value":{"user":"00user9...skipped...","count":229}},
{"key":[2013,11,19,18,24],"value":{"user":"00user244user9...skipped...","count":228}},
{"key":[2013,11,19,18,25],"value":{"user":"0user804","count":1}}
]
}

但如果我在full_set中运行它,我会收到一个错误:

from:
http://127.0.0.1:8092/thomas/_design/dev_uusers/_view/uunsers_per_day?    full_set=true&group=true&stale=false&connection_timeout=60000&limit=10&skip=0
reason:
error (function_clause)

第二种是返回用户ID的更好方法,因为在数百万用户中,随着用户值变得非常大,这将变得非常紧张。正确?

谢谢

2 个答案:

答案 0 :(得分:0)

日志文件mapreduce_errors说什么? (您可以在/ opt / couchbase / var / lib / couchbase / logs中找到该文件)

我猜你会看到'reduction_too_long'的消息。看看以下问题,也许他们会有所帮助:

http://www.couchbase.com/issues/browse/MB-7047?page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel

或此处:http://www.couchbase.com/forums/thread/newbie-question

如果您从日志中包含更多信息,我将能够更好地提供帮助:)

答案 1 :(得分:0)

以下内容并没有很好地减少但是它对我来说有大约300万条记录,并且会根据只有一个发射的时间段为你提供聚合,其中
group_level = 1表示年份 group_level = 2表示按月 group_level = 3表示日期等。

<强>地图

function (doc, meta) {
    // date of document   
    var date = new Date(doc.time);

    // Granularity   
    var day = date.getDate();
    var month = date.getMonth()+1;
    var year = date.getFullYear();
    var hour = date.getHours();
    var min = date.getMinutes();
    var obj ={};
    obj[doc.uid] = 1;
}

<强>减少

function (key, values, rereduce) {

    var userids = {};

    function collate(values) {
        for (userid in values) {
            if (userids[userid])
              userids[userid] +=values[userid]
            else
              userids[userid] =values[userid]
        }
    }
    values.forEach(function(partial) {
        collate(partial)
    }); 

    return userids; 
}

不幸的是,进一步减少超出了我的灰色单元格,如果你返回数组而不是对象,你仍然可以减少你的内存使用量,如果你明智地使用group_level它可能会运行良好。