我在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函数或我的查询有问题吗?
答案 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阶段中值的格式时,re-reduce调用将聚合已减少的值的数量。
解决方案:
rereduce==true
并在这种情况下返回值的总和 - 这将是初始reduce返回的整数值。