【问题标题】:Sum two values in one view separately in CouchDB在 CouchDB 的一个视图中分别对两个值求和
【发布时间】:2019-04-30 22:08:54
【问题描述】:

所以假设我在 CouchDB 中有以下两个文档:

{
   "_id": "197000000002",
   "_rev": "1-fbe819b01108f30d2e9e96f3fb46eff8",
   "iyear": "1970",
   "region_txt": "North America",
   "country": "130",
   "region": "1",
   "country_txt": "Mexico",
   "nkill": "1",
   "nwound": "1",

}

{
       "_id": "197000000003",
       "_rev": "1-fbe819b01108f30d2e9e96f3fb46eff8",
       "iyear": "1970",
       "region_txt": "North America",
       "country": "130",
       "region": "2",
       "country_txt": "Mexico",
       "nkill": "3",
       "nwound": "1"
    }

我想要的是对所有的 nkill 和 nwound 值求和,并有这样的东西:

[1970, "Mexico","North America"]    4, 2

此时我只能对这两个值中的一个或两者进行求和,但这不是我想要的。

我的地图函数现在看起来像这样作为结果返回:

function(doc) {
    if(doc.nkill >= 1) {
        emit([doc.iyear,doc.country_txt,doc.region_txt],parseInt(doc.nkill));
    }
}

我使用 _sum 作为 reduce 函数。

这会返回一个像这样的键和值:

[1970, "Mexico", "North America"]   4

【问题讨论】:

    标签: javascript view mapreduce couchdb couchdb-futon


    【解决方案1】:

    使用自定义的 reduce 函数代替 CouchDB 的内置 _sum

    您可以在reduce 函数中传递一个数组或对象作为值,分别对这两个值求和,然后输出新的数组/对象。

    为了使reduce 函数可以消费一个对象(例如),map 函数应该改为:

    function(doc) {
        if(doc.nkill >= 1) {
            emit([doc.iyear,doc.country_txt,doc.region_txt],
                {nkill: parseInt(doc.nkill), nwound: parseInt(doc.nwound));
        }
    }
    

    另一种方式

    查看 CouchDB 文档后,the strong preference 似乎要从 reduce 函数返回标量值 - 一个数组。 This SO question 涵盖了您的用例:如何分别对同一查询中的两个不同值求和。

    【讨论】:

    • 感谢您的回答,我尝试了地图功能。它给了我两个值。但是现在我有重复的值,并且使用 _sum 值,我至少可以将它们汇总在一起并将它们分组。现在我不知道如何对这两个值做同样的事情。你知道我需要在 reduce 选项中使用什么吗?
    • 查看我的更新 - 还有另一个 SO 问题似乎可以处理您的用例。
    猜你喜欢
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    相关资源
    最近更新 更多