在Couchbase或CouchDB中,是否可以在没有显式reduce函数的情况下进行分组?在我的客户端代码中,我希望将数据提供给我,就像reduce会接收它一样(假设所有映射器都用作输入,即使在rereduce期间)。在没有定义reduce函数的情况下使用group=true
会给出错误:
$ curl http://127.0.0.1:8092/default/_design/testing1/_view/all?group=true
{"error":"query_parse_error",
"reason":"Invalid URL parameter 'group' or 'group_level' for non-reduce view."}
我可以添加身份缩减功能:
reduce(keys,data) {return data;}
但是Couchbase抱怨说我实际上并没有减少任何东西:
{"rows":[], "errors":[
{"from":"local","reason":"{<<"reduce_overflow_error">>,
<<"Reduce output must shrink more rapidly: Current output: '...'
}]}
我确定希望完全减少我的客户。
答案 0 :(得分:1)
这不是技术限制,这是一个逻辑限制。如果不减少这些结果,则无法对结果进行逻辑分组。这类似于SQL中的GROUP BY
,除非在SQL查询中也有某种聚合函数,否则不能使用它。
答案 1 :(得分:0)
使用“身份减少”是Couch风格地图减少的常见陷阱。 Couch reduce系统旨在减少看起来更像的功能:
function(keys, values) {
return values.length;
}
身份减少将最终在非索引数据结构中存储地图行的多个副本。
听起来你想要的是唯一的一组键,无论减少值如何。在这种情况下,我会使用_count reduce函数,因为它是高效的,可以在任何底层数据上运行。