3

在 Couchbase 或 CouchDB 中,是否可以在没有显式 reduce 函数的情况下进行分组?在我的客户端代码中,我希望将数据提供给我,就像 reduce 接收它一样(假设所有映射器都用作输入,即使在 rereduce 期间也是如此)。使用group=true没有定义的 reduce 函数会给我错误:

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

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

4

2 回答 2

1

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

于 2012-07-20T20:12:34.133 回答
0

使用“identity reduce”是 Couch 风格的 map reduce 中的一个常见陷阱。Couch reduce 系统专为 reduce 功能而设计,看起来更像:

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

身份归约最终将在非索引数据结构中存储映射行的多个副本。

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

于 2012-08-07T19:59:37.000 回答