【问题标题】:Couchbase Reduce functionCouchbase 减少功能
【发布时间】:2014-01-28 18:51:46
【问题描述】:

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

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

我的问题是如何创建一个报告,使用户能够深入研究并找到越来越多的数据,一直到各个 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",
}

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

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"}

我想查看这次计算的所有 ip... 我应该如何编写我的 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;

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

我希望这不是乱七八糟的,你可以帮我解决这个问题..

谢谢!!

【问题讨论】:

    标签: map mapreduce couchbase


    【解决方案1】:

    对于您问题的第一部分,我认为您的思路是正确的。这就是您分解视图以启用粗略向下钻取的方式。但是,重要的是要记住,视图并非旨在存储您的整个文档,也不一定能够为您提供清晰的数据样本。您可能需要在代码的访问层内进行精细过滤(可能使用 Linq)。

    对于您问题的第二部分,reduce 不是完成此任务的适当机制。 Reduce 值的大小非常有限(且有限),一旦它们变得太大,就会使 map/reduce 引擎崩溃。我怀疑您已经对此进行了实验并为自己发现了这一点。

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

    【讨论】:

    • 感谢您的回答,我正在尝试仅使用视图使其工作,我认为弹性搜索服务器将能够毫无问题地做到这一点。
    • 我打算推荐 Elasticsearch,但不知道这是否适合您。
    猜你喜欢
    • 2020-11-01
    • 2018-10-29
    • 2020-03-25
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多