Couchbase重新提出了问题

时间:2013-09-24 02:38:12

标签: couchbase

以下是Couchbase文档的编码,我不明白

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);
}
  1. rereduce意味着当前函数调用已经完成了reduce还是没有。对?
  2. reduce函数的第一个参数,key,何时使用?我看到了一些例子,关键似乎未被使用
  3. 什么时候rereduce返回true并且数组大小超过1?
  4. 同样,什么时候rereduce返回为false并且数组大小超过1?

2 个答案:

答案 0 :(得分:2)

  1. Rereduce意味着之前调用reduce函数,现在再次使用params调用它,这些params在第一次reduce调用时返回。因此,如果我们将其分为两个函数,它将如下所示:

    function reduce(k,v){
      // ... doing something with map results
      // instead of returning result we must call rereduce function)
      rereduce(null, result)
    }
    function rereduce(k,v){
      // do something with first reduce result
    }
    

    在大多数情况下,如果您在群集中有2个或更多服务器,或者您的数据库中有很多项目并且计算是在多个节点上进行的,则会发生重新减少。 B *树的。使用2台服务器的示例将更容易理解: 让我们假设你的map函数从第一个服务器返回对[key1-1, key2-2, key6-6],从第二个服务器返回[key5-5,key7-7]。您可以通过以下方式获得2个reduce函数调用: reduce([key1,key2,key6],[1,2,6],false)reduce([key5,key7],[5,7],false)。然后,如果我们只返回值(在reduce中什么都不做,只返回值),则会使用这样的参数调用reduce函数:reduce(null, [[1,2,6],[5,7]], true)。这里的值将是来自第一次减少调用的结果数组。

  2. 关于rereduce键将为null。值将是前一个reduce()函数返回的值数组。

  3. 数组大小仅取决于您的数据。它不取决于rereduce变量。第四个问题的答案相同。
  4. 您可以尝试从Views basicsViews with reduce运行示例。即您可以修改reduce函数以查看每个步骤返回的内容:

    function reduce(k,v,r){
     if (!r){
       // let reduce function return only one value:
       return 1;
     } else {
       // and lets see what values have came in "rereduce"
       return v; 
     }
    }
    

答案 1 :(得分:0)

我也对官方沙发基地网站上的例子感到困惑,下面是我的想法。

混淆:reduce方法签名

1)其写作为 function (keys, values, rereduce)

2)写成function(key, values, rereduce)

第一个参数究竟是什么,

对于我之前在map / reduce上的exp的理解,键是从map函数发出的键,并且有一个隐藏的shuffle方法,它将值聚合到同一个键的值列表中。 因此,在您将数组作为键发出的情况下,关键参数可以是一个数组(您可以逐层控制聚合级别)

所以我不同意@ m03geek提供的示例,它不应该是不同键的列表,如果我错了,请纠正我。

我的假设: 两者都只减少和重新减少 SAME 键的工作。

例如: 减少就像:

1)reduce(keyA,[1,2,3])这是预先计算的,并存储在Btree结构中

2)rereduce(keyA,[6,reduce(keyA,[4,5,6])]),6是第一个reduce方法的[1,2,3]之和,然后我们添加一个新的doc到couchbase,它将再次触发reduce方法,而不是像原始map / reduce那样再次计算整个事物,couchbase从btree获取预先计算的数据,这是从键值对中运行reduce从map方法(通过添加新文档触发),然后对预先计算的值+新值运行re-reduce。