在Couchbase或CouchDB中,是否可以在没有显式减少函数的情况下进行分组?在我的客户端代码中,我希望将数据提供给我,就像reduce接收数据一样(假设所有映射器都用作输入,即使在reduce期间也是如此)。在没有定义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: '...'
}]}
我当然想让我的客户完全降价。
这不是技术限制,而是逻辑限制。如果不减少某些结果,就无法对结果进行逻辑分组。这类似于SQL中的GROUP BY
,除非在SQL查询中也有某种聚合函数,否则不能使用它。
在Couch风格的map reduce中,使用"identity reduce"是一个常见的陷阱。沙发减压系统设计用于减压功能,看起来更像:
function(keys, values) {
return values.length;
}
identityreduce最终将在非索引数据结构中存储映射行的多个副本。
听起来你想要的是一组独特的关键点,而不考虑减少值。在这种情况下,我将使用_count reduce函数,因为它是高效的,并且可以在任何底层数据上运行。