【问题标题】:Grouping the output of a CouchDB View对 CouchDB 视图的输出进行分组
【发布时间】:2017-03-14 06:38:17
【问题描述】:

我有一个地图缩小视图:

.....

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

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

非常感谢。

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

【问题讨论】:

    标签: mapreduce couchdb grouping


    【解决方案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 时,您将获得原始输出。

    【讨论】:

    • @sarwar 谢谢。正是我需要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2016-09-02
    相关资源
    最近更新 更多