CouchDB reduce函数与一个值数组



我有一个映射函数,它以数组的形式返回一个值:

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};

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

当我尝试在运行 for 循环时仅对值或 null 求和时,我会reduce_overflow_error

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

我经常做你正在做的事情,所以这是可能的。

要么你的对象有点超出 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输出完全相同,因此此代码适用于reduce和reduce。

你可以以一种优雅而快速的方式做到这一点,而无需JS减少。让你的map函数发出一个数组,如emit(doc.created_date, [doc.calories, doc.miles, doc.minutes, doc.reps, doc.steps, doc.water]),然后使用内置_sum进行reduce。

结果将是按列计算的总和数组。不为人所知,但是CouchDB非常有用的功能。

相关内容

  • 没有找到相关文章

最新更新