对CouchDB视图的输出进行分组

时间:2017-03-11 16:11:40

标签: mapreduce couchdb grouping

我有一张地图缩小视图:

.....

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而言。

我很感激这方面的一些帮助或指向正确方向的指针。

非常感谢。

编辑: 也许答案在于“减少”过程将输出分组?

1 个答案:

答案 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,您将获得原始输出。