什么是CoucDB等效的SQL COUNT(*)聚合函数?

时间:2009-10-19 01:27:21

标签: couchdb

是的,我是一名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

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

2 个答案:

答案 0 :(得分:41)

在你的简化中:

_count

您还可以使用以下方式获得金额:

_sum

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

请参阅"Built in reduce functions"

答案 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);
}