具有值数组的CouchDB reduce函数

具有值数组的CouchDB reduce函数,couchdb,mapreduce,Couchdb,Mapreduce,我有一个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

我有一个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};
我在coach wiki和其他网站上尝试了几个示例,但我不知道如何访问值数组

当我尝试对值求和时,我得到
reduce\u overflow\u error
,或者在运行for循环时得到null:

for(var i in values) { t_mil = t_mil + values[i].miles }

我做你经常做的事,所以这是可能的

要么您的对象稍微超出了CouchDB的限制,要么您的代码中有一个bug

您可以设置CouchDB配置,
query\u server\u config/reduce\u 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
}
功能(键、VAL、REREREDUCE){
//还原函数
var result={'carries':0,'miles':0,'minutes':0,'steps':0}
对于(变量i=0;i

请注意,reduce输出与map输出完全相同,因此此代码用于reduce和re reduce。

无需JS reduce,您就可以以优雅而快速的方式完成此操作。让地图函数发出一个数组,如
emit(doc.created\u date、[doc.carries、doc.miles、doc.minutes、doc.reps、doc.steps、doc.water])
,然后使用内置的
\u sum
进行reduce


结果将是按列求和的数组。不太清楚,但是CouchDB的功能非常有用。

您想要每个字段的总和吗?您可能只需要为每个字段创建单独的索引。是的,不止一个查询,但这可能是最好的解决方法。