CouchDB减少错误?

时间:2014-06-28 20:59:54

标签: mapreduce couchdb couchdb-futon

我在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函数或我的查询有问题吗?

2 个答案:

答案 0 :(得分:2)

问题可能是因为分组

  

使用group = true(这是Futon的默认值),您可以为地图中的每个唯一键获得单独的reduce值 - 也就是说,共享相同键的所有值都组合在一起并缩减为单个值。

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

  

波音:26

如果没有group=true,则仅返回减少的值。

请尝试此查询

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

答案 1 :(得分:1)

你似乎陷入了re-reduce陷阱。严格来说,Couchdb使用 map-reduce-rereduce 进程。

  • 地图:以输出格式重新格式化您的数据。
  • Reduce:聚合多个(但不是所有具有相同密钥的条目)的数据 - 在您的情况下正常工作。
  • 重新减少:与减少相同,但先前减少了数据。

当您更改reduce阶段中值的格式时,re-reduce调用将聚合已减少的值的数量。

解决方案:

  1. 您只需将地图中的值设置为1即可减少值的总和。
  2. 检查rereduce==true并在这种情况下返回值的总和 - 这将是初始reduce返回的整数值。