是否可以创建一个Couchbase视图,该视图在没有reduce函数的情况下对输出进行分组?

时间:2012-07-20 19:41:10

标签: couchdb couchbase

在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: '...'
    }]}

我确定希望完全减少我的客户。

2 个答案:

答案 0 :(得分:1)

这不是技术限制,这是一个逻辑限制。如果不减少这些结果,则无法对结果进行逻辑分组。这类似于SQL中的GROUP BY,除非在SQL查询中也有某种聚合函数,否则不能使用它。

答案 1 :(得分:0)

使用“身份减少”是Couch风格地图减少的常见陷阱。 Couch reduce系统旨在减少看起来更像的功能:

function(keys, values) {
   return values.length;
}

身份减少将最终在非索引数据结构中存储地图行的多个副本。

听起来你想要的是唯一的一组键,无论减少值如何。在这种情况下,我会使用_count reduce函数,因为它是高效的,可以在任何底层数据上运行。