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

Bra*_*ler 19 couchdb

是的,我是一名SQL骑师(sorta)进入CouchDb Map/Reduce世界.我以为我已经弄清楚CouchDB数据集的COUNT(*)SQL聚合器函数的等价如何与以下内容:

地图:

function(doc) {
  emit(doc.name, doc);
}
Run Code Online (Sandbox Code Playgroud)

降低:

function(keys, values, rereduce){
  return values.length;
}
Run Code Online (Sandbox Code Playgroud)

我觉得有用,返回的内容如下:

"super fun C"   2
"super fun D"   2
"super fun E"   2
"super fun F"   18
Run Code Online (Sandbox Code Playgroud)

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

小智 42

在你的减少只是把:

_计数

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

_和

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

请参阅"内置缩减功能".

  • 这是更好的答案。阅读David在此处发布的有关内置函数的链接。 (2认同)

Wil*_*ris 27

看起来您的减少结果正在重新减少.也就是说,reduce每个键被调用不止一次,然后再用这些结果调用.您可以使用以下reduce函数处理:

function(keys, values, rereduce) {
  if (rereduce) {
    return sum(values);
  } else {
    return values.length;
  }
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以更改map函数,以使值始终为文档计数:

// map
function(doc) {
  emit(doc.name, 1);
}

// reduce
function(keys, values, rereduce) {
  return sum(values);
}
Run Code Online (Sandbox Code Playgroud)

  • 使用javascript reduce函数代替内置函数会给您非常糟糕的性能。见大卫的答案 (2认同)