对 CouchDB 视图的输出进行分组
Grouping the output of a CouchDB View
我有一个地图缩小视图:
.....
emit( diffYears, doc.xyz );
reduced with _sum.
xyz 是一个数字,每个整数 (diffYears) 求和。
输出大致如下所示:
4 1204.9
5 796.19
6 1124.8
7 1112.6
8 1993.62
9 159.26
10 395.41
11 456.05
12 457.97
13 39.80
14 483.68
15 269.469
etc..
我想做的是将结果分组如下:
Grouping Total per group
0-4 1959.2 i.e add up the xyz's for years 0,1,2,3,4
5-9 3998.5 same for 5,6,7,8,9 ...etc.
10-14 3566.3
我看到一个建议,其中在此处的视图输出中使用了列表:Using a CouchDB view, can I count groups and filter by key range at the same time?
但无法对其进行调整以获得任何结果。
给出的代码是:
{
_id: "_design/authors",
views: {
authors_by_date: {
map: function(doc) {
emit(doc.date, doc.author);
}
}
},
lists: {
count_occurrences: function(head, req) {
start({ headers: { "Content-Type": "application/json" }});
var result = {};
var row;
while(row = getRow()) {
var val = row.value;
if(result[val]) result[val]++;
else result[val] = 1;
}
return result;
}
}
}
我在这部分替换了 var val = row.key
:
while(row = getRow()) {
var val = row.value;
if(result[val]) result[val]++;
else result[val] = 1;
}
(虽然在这种情况下结果是计数。)
这似乎是实现它的方法。
(这就像每个分组都有一个开始键和结束键,我可以自然地手动完成,但不能在进程内完成。或者有没有一种方法可以在一个 GET 命令中输入多个开始键和结束键??? ?)
这一定是一件很正常的事情,尤其是对于使用统计分析的研究人员来说。
因此我认为它确实完成了,但我找不到示例
就 CouchDB 而言。
请在这方面提供一些帮助或指向正确方向的指示,我将不胜感激。
非常感谢。
编辑:
也许答案在于 'reduce' 中的一个过程来对输出进行分组??
您可以使用复杂的键来完成您想要的。限制是组大小是静态的,需要在视图中定义。
您需要一个简单的步骤函数来在地图中创建您的群组,例如:
var size = 5;
var group = ( doc.diffYears - (doc.diffYears % size)) / size;
emit( [group, doc.diffYears], doc.xyz);
reduce函数可以保持_sum。
现在,当您查询视图时,使用 group_level 来控制分组。在 group_level=0 时,将对所有内容求和并返回一个值。在 group_level=1 时,您将收到所需的总和 0-4、5-9 等。在 group_level=2 时,您将获得原始输出。
我有一个地图缩小视图:
.....
emit( diffYears, doc.xyz );
reduced with _sum.
xyz 是一个数字,每个整数 (diffYears) 求和。
输出大致如下所示:
4 1204.9
5 796.19
6 1124.8
7 1112.6
8 1993.62
9 159.26
10 395.41
11 456.05
12 457.97
13 39.80
14 483.68
15 269.469
etc..
我想做的是将结果分组如下:
Grouping Total per group
0-4 1959.2 i.e add up the xyz's for years 0,1,2,3,4
5-9 3998.5 same for 5,6,7,8,9 ...etc.
10-14 3566.3
我看到一个建议,其中在此处的视图输出中使用了列表:Using a CouchDB view, can I count groups and filter by key range at the same time? 但无法对其进行调整以获得任何结果。 给出的代码是:
{
_id: "_design/authors",
views: {
authors_by_date: {
map: function(doc) {
emit(doc.date, doc.author);
}
}
},
lists: {
count_occurrences: function(head, req) {
start({ headers: { "Content-Type": "application/json" }});
var result = {};
var row;
while(row = getRow()) {
var val = row.value;
if(result[val]) result[val]++;
else result[val] = 1;
}
return result;
}
}
}
我在这部分替换了 var val = row.key
:
while(row = getRow()) {
var val = row.value;
if(result[val]) result[val]++;
else result[val] = 1;
}
(虽然在这种情况下结果是计数。)
这似乎是实现它的方法。
(这就像每个分组都有一个开始键和结束键,我可以自然地手动完成,但不能在进程内完成。或者有没有一种方法可以在一个 GET 命令中输入多个开始键和结束键??? ?)
这一定是一件很正常的事情,尤其是对于使用统计分析的研究人员来说。
因此我认为它确实完成了,但我找不到示例 就 CouchDB 而言。
请在这方面提供一些帮助或指向正确方向的指示,我将不胜感激。
非常感谢。
编辑: 也许答案在于 'reduce' 中的一个过程来对输出进行分组??
您可以使用复杂的键来完成您想要的。限制是组大小是静态的,需要在视图中定义。
您需要一个简单的步骤函数来在地图中创建您的群组,例如:
var size = 5;
var group = ( doc.diffYears - (doc.diffYears % size)) / size;
emit( [group, doc.diffYears], doc.xyz);
reduce函数可以保持_sum。
现在,当您查询视图时,使用 group_level 来控制分组。在 group_level=0 时,将对所有内容求和并返回一个值。在 group_level=1 时,您将收到所需的总和 0-4、5-9 等。在 group_level=2 时,您将获得原始输出。