【问题标题】:CouchDB reduce error?CouchDB 减少错误?
【发布时间】:2014-06-28 20:59:53
【问题描述】:

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

【问题讨论】:

    标签: mapreduce couchdb couchdb-futon


    【解决方案1】:

    问题可能是因为分组

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

    在使用 curl 等进行查询时,您是否将 group=true 作为查询参数传递?由于默认情况下它在被褥中传递,因此您会看到类似

    的结果

    波音:26

    在没有group=true 的情况下,只返回减少的值。

    所以试试这个查询

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

    【讨论】:

    • 谢谢!这确实是我需要的。我对 CouchDB 很陌生,有些事情我没有注意。而使用group=true 也解决了null 键的问题,在这种情况下,虽然值正确,但键始终是null。但是现在我想知道,为什么我们需要groupreduce 两个参数呢?在这种情况下只有reduce有用???
    • 不同之处在于groupgroup_level 为每组唯一键运行reduce,而reduce 将结果缩减为单个值。因此,如果您有另一个制造商,例如ACME,上述查询将返回结果BOEING:26,ACME:1,而reduce 将返回27。因此,分组就像在键上运行多个减少一样。 More on wiki。顺便说一句,我希望你喜欢 couchdb :)
    • 再次感谢!我尝试了有和没有group 的东西,我想现在我对它有了更多的了解。但是,当密钥包含“BOEING”和group=false(始终为 2)时,我仍然会得到一个奇怪的结果,而其他结果是正确的。当group=true时,结果也是正确的。也许我的文档有问题?顺便说一句,我使用的是 CouchDB 1.5,这可能是 1.6 中已经修复的错误吗? (由于一些未知的原因,我没有成功让 1.6 在我的 Windows 7 上运行)。而且我很喜欢 CouchDB,我想深入了解它!
    【解决方案2】:

    您似乎落入了re-reduce 陷阱。 Couchdb 严格来说使用 map-reduce-rereduce 过程。

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

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

    解决方案:

    1. 您可以将映射中的值设置为 1 并减少值的总和。
    2. 您检查rereduce==true 并在这种情况下返回值的总和——这将是初始reduce 返回的整数值。

    【讨论】:

    • 谢谢!我试过你提到的,虽然我100%同意你,但结果几乎是一样的。如果我使用您的解决方案,无论我是否使用group,我都会得到26架波音飞机,但所有其他飞机都一样!也就是说,无论我是否使用group,我都会得到相同数量的飞机。这很奇怪!但同样,我 100% 同意您的解决方案,我会牢记这一点!
    猜你喜欢
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    相关资源
    最近更新 更多