我有一个map函数,它将一个值作为数组返回:
emit(doc.created_date, { calories : doc.calories, miles : doc.miles, minutes : doc.minutes, reps : doc.reps, steps : doc.steps, water : doc.water })
我想对所有返回值的卡路里,里程,分钟和步数进行总和。像
return {"calories":t_cal,"miles":t_mil, "minutes":t_min,"steps":t_step};
我已经尝试过沙发维基和其他网站的几个例子,但我无法弄清楚如何访问值数组。
当我尝试对值进行求和时运行reduce_overflow_error
或运行for循环时为null:
for(var i in values) { t_mil = t_mil + values[i].miles }
答案 0 :(得分:5)
我做了很多你做的事,所以有可能。
您的对象比CouchDB的限制一点,或者您的代码中存在错误。
您可以设置CouchDB配置query_server_config/reduce_limit = "false"
并查看它的外观。
但是,如果您只积累了四个项目,我认为这不是减少限制问题。我经常遇到的是JavaScript问题。例如,向字符串添加数字会生成(更长)字符串。添加更多数字会使字符串越来越长。
var old_value = "3" // This is a bad value, perhaps from a map function bug
var new_value = 5
new_value = new_value + old_value // I wanted 8, but I got "53"
new_value = new_value + 2012 // I wanted 2020 but I got "532012"
阵列和其他类型也会出现类似问题。
你有一个良好的开端,map
函数发出与reduce
返回相同的东西(一个对象)。也许您可以发布一些您正在使用的代码。我通常做这样的事情:
function(keys, vals, rereduce) {
// reduce function
var result = {'calories':0, 'miles':0, 'minutes':0, 'steps':0}
for(var i = 0; i < vals.length; i++) {
result.calories += vals[i].calories || 0
result.miles += vals[i].miles || 0
result.minutes += vals[i].minutes || 0
result.steps += vals[i].steps || 0
}
return result
}
请注意,reduce输出与map输出完全相同,因此此代码适用于减少和重新减少。
答案 1 :(得分:1)
你可以在没有JS减少的情况下以优雅而快速的方式完成。让map函数发出一个数组,如emit(doc.created_date, [doc.calories, doc.miles, doc.minutes, doc.reps, doc.steps, doc.water])
,然后使用内置的_sum
进行reduce。
结果将是按列排列的数组。不太知名,但CouchDB非常有用。