带有值数组的 CouchDB reduce 函数

标签 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":t_min,"steps":t_step};

我已经尝试了沙发维基和其他网站的几个示例,但我不知道如何访问值数组。

我得到 reduce_overflow_error 当我尝试在运行 for 循环时仅对值求和或 null 时:

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 和 re-reducing。

关于带有值数组的 CouchDB reduce 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10081353/

相关文章:

caching - CouchDB支持缓存吗?

mysql - CouchDB性能分析

couchdb - OLAP 中的 CouchDB 怎么样?

couchdb - 将 PouchDB 与 CouchDB 服务器同步

mongodb - 子数组上的MongoDb MapReduce

erlang - 如何使用 ibrowse 将附件上传到 CouchDB 中的文档?

java - MapReduce 扫描 HBase 时,Reducer 的个数始终为一个

apache-spark - 映射减少问题,按值计算

javascript - 如何在 Mongoose mapreduce 中调用相关模型

java - HBase 中的组合键