以下是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);
}
答案 0 :(得分:2)
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)
。这里的值将是来自第一次减少调用的结果数组。
关于rereduce键将为null。值将是前一个reduce()函数返回的值数组。
您可以尝试从Views basics和Views 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。