我有一张地图缩小视图:
.....
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;
}
(虽然在这种情况下结果是计数。)
这似乎就是这样做的方式。
(就像为每个分组创建一个startkey和endkey,我可以自然地手动完成,但不能在进程内部进行。或者有一种方法可以将多个start-和endkeys输入到一个GET命令中?)
对于使用统计分析的研究人员而言,这一点必须是相当正常的事情。
因此我认为它确实已经完成,但我无法找到示例 就CouchDB而言。
我很感激这方面的一些帮助或指向正确方向的指针。
非常感谢。
编辑: 也许答案在于“减少”过程将输出分组?
答案 0 :(得分:1)
您可以使用复杂的键完成所需的操作。限制是组大小是静态的,需要在视图中定义。
您需要一个简单的步骤功能来在地图中创建您的群组,例如:
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,您将获得原始输出。