为什么couchdb的减少是以这种方式实现的?

时间:2013-03-27 06:58:21

标签: javascript view couchdb couchbase reduce

例如,这是一个返回行的总和和长度的函数:

function(key, values, rereduce) {
  var result = {total: 0, count: 0};
  for(i=0; i < values.length; i++) {
    if(rereduce) {
        result.total = result.total + values[i].total;
        result.count = result.count + values[i].count;
    } else {
        result.total = sum(values);
        result.count = values.length;
    }
  }
  return(result);
}

看起来你必须定义:

  • 减少所有元素的方法。
  • 对部分减少进行分组的方法(??)

为什么这么奇怪?传统方法可以简单描述为:

reduce = {
    op: function(accumulated,val){
        return {total:accumulated.total + val, count:accumulated.count++};
    },
    initial: {total:0, count:0}
}

其中包含足够的信息来减少整个数组并为新值更新它......!

1 个答案:

答案 0 :(得分:2)

reduce阶段是重复的,因为它使存储/缓存更容易。您应该将reduce函数的结果想象为树。要减少某个连续的节点子集,您可以在很大程度上使用预先计算的减少值(以及一些原始的减少值),这样您就不必下降整个树/重新计算其中所有节点的值。查询范围。

我希望稍微澄清一下,这有点难以解释。