我有很多这样的文件:
{
"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_rate
和web_data.average_order_value
的平均值以及web_data.visitor_count
,web_data.visits_count
和web_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想要像这样奇怪地做事。