是的,我是一名SQL专业人士(sorta)进入CouchDb Map / Reduce世界。我以为我已经弄清楚CouchDB数据集的COUNT(*)SQL聚合器函数的等效函数如何:
地图:
function(doc) {
emit(doc.name, doc);
}
减少:
function(keys, values, rereduce){
return values.length;
}
我觉得有用,返回的内容如下:
"super fun C" 2
"super fun D" 2
"super fun E" 2
"super fun F" 18
......但不是真的。当我添加记录时,此计数变化很大。有时计数减少,这是非常令人惊讶的。难道我做错了什么?也许我不完全理解最终一致性的概念?
答案 0 :(得分:41)
在你的简化中:
_count
您还可以使用以下方式获得金额:
_sum
所以基本上减少:“_sum”或reduce:“_ count”并确保你的地图发出的值是一个有效的整数(数值)
答案 1 :(得分:26)
看起来你的减少结果正在重新减少。也就是说,对于每个键,reduce
被多次调用,然后再次使用这些结果调用。您可以使用reduce
函数处理此问题:
function(keys, values, rereduce) {
if (rereduce) {
return sum(values);
} else {
return values.length;
}
}
或者,您可以更改map
函数,以使值始终为文档计数:
// map
function(doc) {
emit(doc.name, 1);
}
// reduce
function(keys, values, rereduce) {
return sum(values);
}