CouchDB使用一组值减少函数

Mil*_*ber 2 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 })
Run Code Online (Sandbox Code Playgroud)

我想对所有返回值的卡路里,里程,分钟和步数进行总和.喜欢

return {"calories":t_cal,"miles":t_mil, "minutes":t_min,"steps":t_step};
Run Code Online (Sandbox Code Playgroud)

我已经尝试了沙发维基和其他网站的几个例子,但我无法弄清楚如何访问值数组.

reduce_overflow_error当我尝试将值相加或运行for循环时为null时,我得到:

for(var i in values) { t_mil = t_mil + values[i].miles }
Run Code Online (Sandbox Code Playgroud)

Jas*_*ith 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"
Run Code Online (Sandbox Code Playgroud)

阵列和其他类型也会出现类似的问题.

你有一个良好的开端,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
}
Run Code Online (Sandbox Code Playgroud)

请注意,reduce输出与map输出完全相同,因此此代码适用于减少和重新减少.