【发布时间】: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;
我没有得到我正在寻找的答案格式..
我希望这不是乱七八糟的,你可以帮我解决这个问题..
谢谢!!
【问题讨论】: