CouchDB计算组的总和和平均值

时间:2016-07-05 09:52:52

标签: mapreduce couchdb reduce

我有很多这样的文件:

{
   "schema": "property",
   "schema_version": 1,
   "name": "test foobar"
   "account": "1969360",
   "web_data": {
       "conversion_rate": 1.49,
       "average_order_value": 123,
       "visitor_count": 25000,
       "visits_count": 35000,
       "revenue": 50000
   }
}

可能有多个文档具有相同的account

现在我应该创建MapReduce来计算web_data.conversion_rateweb_data.average_order_value的平均值以及web_data.visitor_countweb_data.visits_countweb_data.revenue的总和,以用于每个具有相同{ {1}}。

目前我的映射函数发出如下数组:

account

其中第一项为['10449266', 'test foobar'] ,第二项为account

发布的价值仅为name

我希望输出如下:

GET / list_properties?group_level = 1

web_data

我怎么能实现这个目标? 相当复杂的模式,是吗?

我已经尝试了很多减少功能来做到这一点,我现在已经筋疲力尽了。这是我试图开始的那个:

{
    rows: [
        {
            key: [
                "10449266"
            ],
            value: {
              "property_count": 2,
              "conversion_rate": 1.8625,
              "average_order_value": 153.75,
              "visitor_count": 31250,
              "visits_count": 43750,
              "revenue": 62500
            }
        },
        {
            key: [
                "66294401"
            ],
            value: { ... }
        },
        ...
}

这不起作用,因为它返回对象而不是数字。我不明白为什么。它总结数字并返回对象?

修改

我将reduce函数更新为:

function (keys, values, rereduce) {
    return values.reduce(function(a, b){
        return a + b.web_data.revenue;
    });
}

现在我得到这样的回应:

function (keys, values, rereduce) {
    if(rereduce){
        return values;
    }else{
        var revenue = values.reduce(function(a, b){
            return a + b.web_data.revenue;
        }, 0);

        return {
            revenue       : revenue
        };
    }
}

现在,如果我在rereduce-part中将{ "key": [ "2035864" ], "value": [ [ { "revenue": 0 }, { "revenue": 66321.2 }, { "revenue": 5319.35 } ], [ { "revenue": 0 } ], [ { "revenue": 45432.02 } ], [ { "revenue": 185732.78 } ] ] } 更改为return values,我会得到以下回复:

return values[0]

再次没有了!

我想要的一切只是:

{
    "key": [
        "2035864"
    ],
    "value": {
        "revenue": 0
    }
}

JavaScript允许在浏览器中轻松完成此操作,但我不明白为什么CouchDB想要像这样奇怪地做事。

0 个答案:

没有答案