什么是与SQL COUNT(*)聚合函数等价的CouchDB?
是的,我是一名SQL骑师(sorta),即将进入CouchDb Map/Reduce世界。我想我已经了解了COUNT(*)SQL aggregator函数对于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
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);
}