什么是与SQL COUNT(*)聚合函数等价的CouchDB?

什么是与SQL COUNT(*)聚合函数等价的CouchDB?,couchdb,Couchdb,是的,我是一名SQL骑师(sorta),即将进入CouchDb Map/Reduce世界。我想我已经了解了COUNT(*)SQL aggregator函数对于CouchDB数据集的等效功能是如何实现的: 地图: 减少: function(keys, values, rereduce){ return values.length; } 我认为这是有效的,返回的内容如下: "super fun C" 2 "super fun D" 2 "super fun E" 2 "super

是的,我是一名SQL骑师(sorta),即将进入CouchDb Map/Reduce世界。我想我已经了解了COUNT(*)SQL aggregator函数对于CouchDB数据集的等效功能是如何实现的:

地图:

减少:

function(keys, values, rereduce){
  return values.length;
}
我认为这是有效的,返回的内容如下:

"super fun C"   2
"super fun D"   2
"super fun E"   2
"super fun F"   18

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

看起来您的reduce结果正在重新减少。也就是说,对于每个键,
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);
}

在你的发言中,请说:

_计数

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

_总数

因此,基本上减少:“\u sum”或减少:“\u count”,并确保贴图发出的值是有效的整数(数值)


请参阅。

这是更好的答案。阅读David在这里发布的关于内置函数的链接。使用javascript reduce函数而不是内置函数会给您带来非常糟糕的性能。见大卫的答案
// map
function(doc) {
  emit(doc.name, 1);
}

// reduce
function(keys, values, rereduce) {
  return sum(values);
}