2014-06-28 36 views
1

我在CouchDB中有一个示例数据库,其中包含多个飞机的信息,以及一个显示制造商为关键字和模型作为值的视图。CouchDB减少错误?

地图功能是

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

和减少功能

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

这是非常简单的。我确实得到正确的结果,当我用被褥,在那里我有26架飞机波音的显示视图:

​​

但是,如果使用REST客户端查询使用

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

我的看法得到

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

我测试了不同的客户端(包括Web浏览器,REST客户端扩展和卷曲),所有给我的价值2!而使用其他键的查询正常工作。

MapReduce函数或查询有问题吗?

回答

1

问题可能是因为分组

使用组= true(此蒲团默认的),你会得到一个单独的在地图中的每个唯一键减少值的 - 那就是,所有的值该共享相同的密钥分组在一起并减少为单个值。

在查询curl等时,您是否通过group=true作为查询参数?由于它在默认情况蒲团通过你看到的结果一样

BOEING:26

凡为无group=true正在返回只降低的价值。

因此,尝试此查询

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

+0

谢谢!这确实是我需要的。我对CouchDB相当陌生,有些事情我没有注意。而使用'group = true'也解决了'null'键的问题,在这种情况下,虽然值是正确的,但键总是'null'。但是现在我想知道,为什么我们需要'group'和'reduce'两个参数?在这种情况下只有'reduce'有用? –

+0

区别在于,对于每组唯一键,“group”和“group_level”运行减少,其中reduce将结果减少为单个值。所以如果你有另一个像'ACME'的制造商,上面的查询将返回一个结果'BOEING:26,ACME:1',其中reduce将返回'27'。因此,像运行多个分组一样减少键。 [更多关于wiki](http://wiki.apache.org/couchdb/Introduction_to_CouchDB_views#Grouping)。顺便说一句,我希望你享受couchdb :) –

+0

再次感谢!我尝试了使用和不使用“组”的东西,我现在认为我对它有更多的了解。但是,当密钥包含“BOEING”和“group = false”时,我仍然得到一个奇怪的结果,它总是2,而其他结果是正确的。当'group = true'时,结果也是正确的。也许我的文档有问题?顺便说一下,我使用的是CouchDB 1.5,它可能是一个已经在1.6中修复的bug吗? (由于一些未知的原因,我没有成功地让我的Windows 7工作1.6)。我喜欢CouchDB,我想深入其中! –

1

你似乎陷入了re-reduce -trap。 Couchdb严格地说使用了一个map-reduce-rereduce进程。

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

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

解决方案:

  1. 您可以在地图中值正好被设置为1,降低值的总和。
  2. 您检查rereduce==true,并在这种情况下返回值的总和 - 这将是初始reduce返回的整数值。
+0

谢谢!我试过你提到的,虽然我100%同意你的看法,但结果几乎一样。如果我使用您的解决方案,无论使用“群组”还是不使用26架波音飞机,但所有其他飞机都是相同的!也就是说,无论我使用“group”还是不使用,我都能获得相同数量的飞机。这很奇怪!但是,我再次同意你的解决方案,我会保持这种想法! –