Couchbase减少功能

时间:2014-01-28 18:51:46

标签: map mapreduce couchbase

我正在尝试学习如何在Couchbase中使用map reduce功能。到目前为止,我创建了基于SQL的报表引擎,使用Where with multi terms(添加和减去术语)并修改组部分。

我正在尝试使用视图创建此报告引擎。

我的问题是如何创建一个报告,使用户能够潜入并查找越来越多的数据,一直到单个IP统计数据。 例如。今天有多少次点击?哪个流量来源?他们看到了什么?哪个国家 ?等等。

此示例的基本文档如下所示:

"1"
{
 "date": "2014-01-13 10:00:00",
  "ip": "111.222.333.444",
  "country": "US",
  "source":"1",
}
"2"
{
 "date": "2014-01-13 10:00:00",
  "ip": "555.222.333.444",
  "country": "US",
  "source":"1",
}
"3"
{
 "date": "2014-01-13 11:00:00",
  "ip": "111.888.888.888",
  "country": "US",
  "source":"2",
}
"4"
{
 "date": "2014-01-13 11:00:00",
  "ip": "111.777.777.777",
  "country": "US",
  "source":"1",
}

所以我想让用户在第一个屏幕上看到这个网站每天有多少次点击。 所以我需要计算点击量。简单的map / reduce: MAP:

function (doc, meta) {
     emit(dateToArray(doc.date),1);
}
Reduce:
_count

小组等级4,小组真实

将创建每小时点击次数。

现在,如果我想允许分解国家,那么我需要一个动态的参数来改变..从我的理解它只能由集团层面... 所以假设我已经将这个添加到了这样的发射器中:

emit([dateToArray(doc.date),source],1);

然后分组级别5将允许这种划分,并且使用密钥过于关注一个证书日期..但是如果我需要添加一个县分解怎么办?再次将它添加到发射? 这似乎是一团糟,如果我想在源之前做一个国家统计数据..有没有更聪明的方法来做到这一点?

第二部分......

如果我想得到如下的第一个计数怎么办?

[2014,1,28,10] {ip:"555.222.333.444","111.222.333.444","count":"2"}

我希望看到这次计算的所有ips ... 我该怎么写我的reduce函数?

这是我现在的状态不起作用..

function(key, values, rereduce) {
  var result = {id: 0, count: 0};
  for(i=0; i < values.length; i++) {
    if(rereduce) {
        result.id = result.id + (values[i]).ip +',';
        result.count = result.count + values[i].count;
    } else {
        result.id = values.ip;
        result.count = values.length;
    }
  }
  return result;

我没有得到我正在寻找的答案格式..

我希望这不要乱,你可以帮我解决这个问题。

谢谢!

1 个答案:

答案 0 :(得分:1)

对于问题的第一部分,我认为你走在了正确的轨道上。这就是你如何分解视图以实现粗略向下钻取。但是,重要的是要记住,视图不是用于存储整个文档,也不一定能够为您提供干净的数据样本。您可能需要在代码的访问层中进行精细过滤(可能使用Linq)。

对于问题的第二部分,reduce不是实现此目的的适当机制。减少值具有非常有限(且有限)的大小,并且一旦它们变得太大就会使映射/减少引擎崩溃。我怀疑你已经尝试过并亲自发现了这一点。

您提出问题的方式,似乎您希望搜索所有已被计为“X”次数的IP地址。这不能直接在Couchbase的map / reduce架构中完成;但是,如果你只想要给定IP地址的计数,那就是map / reduce框架内置的东西(只需使用Date + IP作为键)。

相关问题