2

我在 CouchDB 中有一个示例数据库,其中包含许多飞机的信息,以及一个将制造商显示为键、模型显示为值的视图。

地图功能是

function(doc) {
    emit(doc["Manufacturer"], doc._id)
}

而reduce函数是

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

这很简单。当我使用 Futon 显示视图时,我确实得到了正确的结果,我有 26 架波音飞机:

"BOEING"    26

但是,如果我使用 REST 客户端来查询视图

http://localhost:6060/aircrafts/_design/basic/_view/VendorProducts?key="BOEING"

我明白了

{"rows":[
    {"key":null,"value":2}
]}

我测试了不同的客户端(包括 Web 浏览器、REST 客户端扩展和 curl),都给了我 2 的值!虽然使用其他键的查询正常工作。

MapReduce 函数或我的查询有问题吗?

4

2 回答 2

2

问题可能是因为分组

使用 group=true (这是 Futon 的默认设置),您可以为映射中的每个唯一键获得单独的 reduce 值 - 也就是说,共享相同键的所有值被分组在一起并减少为单个值。

使用 curl 等进行查询时,您是否将group=true其作为查询参数传递?由于默认情况下它在蒲团中传递,因此您看到的结果如下

波音 : 26

没有group=true只返回减少的值。

所以试试这个查询

http://localhost:6060/aircrafts/_design/basic/_view/VendorProducts?key="BOEING"&group=true

于 2014-06-29T02:39:42.397 回答
1

你似乎掉进了re-reduce-trap。Couchdb 严格来说使用map-reduce-rereduce过程。

  • 地图:以输出格式重新格式化您的数据。
  • 减少:聚合几个(但不是所有具有相同键的条目)的数据 - 这在您的情况下可以正常工作。
  • Re-reduce:与reduce 相同,但在先前减少的数据上。

当您在缩减阶段更改值的格式时,重新缩减调用将聚合已缩减值的数量。

解决方案:

  1. 您可以将地图中的值设置为 1 并减少值的总和。
  2. 您检查rereduce==true并在这种情况下返回值的总和 - 这将是初始归约返回的整数值。
于 2014-06-28T22:20:26.417 回答