3

値を配列として返す 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};

ソファ wiki や他のサイトの例をいくつか試しましたが、値の配列にアクセスする方法がわかりません。

reduce_overflow_errorforループを実行しているときに値またはnullを合計しようとすると、次のようになります。

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

2 に答える 2

6

私はあなたがたくさんやっていることをしますので、それは可能です。

オブジェクトがCouchDB の制限を少し超えているか、コードにバグがあります。

CouchDB 構成を設定して、query_server_config/reduce_limit = "false"それがどのように見えるかを確認できます。

ただし、アイテムが4つしか蓄積されていない場合は、制限を減らす問題ではないと思います. いつも私に起こるのは、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-reduce に機能します。

于 2012-04-10T03:50:08.503 に答える
4

JSを減らすことなく、エレガントで高速な方法でそれを行うことができます. map 関数が のような配列を発行するようにしてから、reduceemit(doc.created_date, [doc.calories, doc.miles, doc.minutes, doc.reps, doc.steps, doc.water])にビルトインを使用します。_sum

結果は、列ごとの合計の配列になります。あまり知られていませんが、CouchDB の非常に便利な機能です。

于 2017-10-19T16:19:10.477 に答える