21

是的,我是进入 CouchDb Map/Reduce 世界的 SQL 骑师 (sorta)。我以为我已经弄清楚了 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

......但不是真的。当我添加一条记录时,这个计数变化很大。有时计数实际上会减少,这非常令人惊讶。难道我做错了什么?也许我不完全理解最终一致性的概念?

4

2 回答 2

44

在你的减少只是放:

_数数

您还可以使用以下方法获得总和:

_和

所以基本上减少:“_sum”或减少:“_count”并确保您的地图发出的值是一个有效的整数(数值)

请参阅“内置 reduce 函数”

于 2010-03-30T15:29:11.053 回答
28

看起来您的减少结果正在重新减少。也就是说,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);
}
于 2009-10-19T01:56:11.713 回答