我正在尝试学习如何在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;
我没有得到我正在寻找的答案格式..
我希望这不要乱,你可以帮我解决这个问题。
谢谢!
答案 0 :(得分:1)
对于问题的第一部分,我认为你走在了正确的轨道上。这就是你如何分解视图以实现粗略向下钻取。但是,重要的是要记住,视图不是用于存储整个文档,也不一定能够为您提供干净的数据样本。您可能需要在代码的访问层中进行精细过滤(可能使用Linq)。
对于问题的第二部分,reduce不是实现此目的的适当机制。减少值具有非常有限(且有限)的大小,并且一旦它们变得太大就会使映射/减少引擎崩溃。我怀疑你已经尝试过并亲自发现了这一点。
您提出问题的方式,似乎您希望搜索所有已被计为“X”次数的IP地址。这不能直接在Couchbase的map / reduce架构中完成;但是,如果你只想要给定IP地址的计数,那就是map / reduce框架内置的东西(只需使用Date + IP作为键)。