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

wko9yo5t  于 2022-12-09  发布在  CouchDB
关注(0)|答案(2)|浏览(184)

是的,我是一个SQL操作员(排序)进入CouchDb Map/Reduce的世界。我想我已经弄清楚了CouchDB数据集的COUNT(*)SQL聚合器函数的等价物是如何使用以下内容的:
Map:

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

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

xfyts7mz

xfyts7mz1#

在你的减少只是把:
计数(_C)
您也可以使用以下方法获得总和:
总和(_S)
因此基本上减少了:“_sum”或减少:“_count”并确保贴图发出的值是有效的整数(数值)
请参见“内置reduce函数”。

oalqel3c

oalqel3c2#

看起来你的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);
}

相关问题