Mapreduce 可以减少错误吗?

Mapreduce 可以减少错误吗?,mapreduce,couchdb,couchdb-futon,Mapreduce,Couchdb,Couchdb Futon,我在CouchDB中有一个样本数据库,其中包含许多飞机的信息,还有一个视图,其中制造商是关键,模型是值 map函数是 function(doc) { emit(doc["Manufacturer"], doc._id) } function(keys, values, rereduce){ return values.length; } 并且reduce函数是 function(doc) { emit(doc["Manufacturer"], doc._id) }

我在CouchDB中有一个样本数据库,其中包含许多飞机的信息,还有一个视图,其中制造商是关键,模型是值

map函数是

function(doc) {
    emit(doc["Manufacturer"], doc._id)
}
function(keys, values, rereduce){
    return values.length;
}
并且reduce函数是

function(doc) {
    emit(doc["Manufacturer"], doc._id)
}
function(keys, values, rereduce){
    return values.length;
}
这很简单。当我用Futon显示视图时,我确实得到了正确的结果,我有26架波音飞机:

"BOEING"    26
但是如果我使用REST客户机使用

http://localhost:6060/aircrafts/_design/basic/_view/VendorProducts?key="BOEING"
我明白了

我已经测试了不同的客户端(包括web浏览器、REST客户端扩展和curl),所有这些都给了我值2!而使用其他键的查询工作正常


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

您似乎陷入了
重新还原的陷阱。严格来说,Couchdb使用map reduce reduce进程

  • 映射:以输出格式重新格式化数据
  • Reduce:聚合多个(但不是所有具有相同密钥的条目)的数据,这在您的情况下是正确的
  • Re reduce:与reduce相同,但基于先前缩减的数据
当您在reduce阶段更改值的格式时,re reduce调用将聚合已经减少的值的数量

解决方案:

  • 您只需将贴图中的值设置为1并减少值的总和
  • 检查
    rereduce==true
    ,在这种情况下,返回一个值的总和-这将是初始reduce返回的整数值
    问题可能是因为分组

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

    使用curl等进行查询时,是否将
    group=true
    作为查询参数传递?因为它在futon中默认通过,所以您看到的结果如下

    波音:26

    其中as without
    group=true
    仅返回减少的值

    所以试试这个查询

    http://localhost:6060/aircrafts/_design/basic/_view/VendorProducts?key=“波音”&集团=真
    

    谢谢!这确实是我需要的。我对CouchDB很陌生,有些事情我没有注意到。使用
    group=true
    也解决了
    null
    键的问题,在这种情况下,尽管值是正确的,但键始终是
    null
    。但现在我想知道,为什么我们需要
    group
    reduce
    两个参数?在这种情况下,只有
    reduce
    有用吗???区别在于
    group
    group\u level
    为每组唯一键运行reduce,其中as reduce将结果减少为单个值。因此,如果您有另一个制造商,如
    ACME
    ,上述查询将返回结果
    BOEING:26,ACME:1
    ,其中as reduce将返回
    27
    。所以分组就像在关键点上运行多个reduces。顺便说一句,我希望你喜欢couchdb:)再次感谢!我尝试了一些有
    组和没有
    组的东西,我想现在我对它有了更多的了解。但是,当键包含“BOEING”和
    group=false
    (始终为2)时,我仍然得到一个奇怪的结果,而其他结果是正确的。当
    group=true
    时,结果也是正确的。也许我的医生有问题?顺便说一句,我使用的是CouchDB 1.5,这可能是1.6中已经修复的错误吗?(由于一些未知的原因,我没有成功地使1.6在我的Windows7上工作)。我很喜欢CouchDB,我想深入了解它!谢谢我尝试了你提到的,虽然我100%同意你,但结果几乎是一样的。如果我使用你的解决方案,我将得到26架波音飞机,无论我是否使用
    ,但所有其他飞机都是一样的!也就是说,无论我是否使用
    ,我都会得到相同数量的飞机。真奇怪!不过,我还是100%同意你的解决方案,我会记住这一点!