0

これはCouchbaseドキュメントからのコーディングであり、理解できません

function(key, values, rereduce) {
  var result = {total: 0, count: 0};
  for(i=0; i < values.length; i++) {
    if(rereduce) {
        result.total = result.total + values[i].total;
        result.count = result.count + values[i].count;
    } else {
        result.total = sum(values);
        result.count = values.length;
    }
  }
  return(result);
}
  1. rereduce は、現在の関数呼び出しが既に reduce を実行したかどうかを意味します。右?
  2. reduce 関数の最初の引数である key は、いつ使用されますか? 例をいくつか見ましたが、キーは未使用のようです
  3. rereduce が true を返し、配列サイズが 1 より大きいのはいつですか?
  4. 繰り返しになりますが、rereduce の戻り値が false で、配列サイズが 1 より大きいのはどのような場合ですか?
4

2 に答える 2

0

また、公式のcouchbase Webサイトの例にも混乱しています.以下は私が考えたものです.

混乱: reduce メソッドのシグネチャ

1) 関数(キー、値、rereduce)として書かれています

2) function(key, values, rereduce)として書かれています

最初のパラメーター、キー、またはキーは正確には何ですか

マップ/リデュースに関する以前の経験から、キーはマップ関数から発行されるキーであり、値を同じキーの値リストに集約する隠しシャッフルメソッドがあります。そのため、配列をキーとして発行する状況では、キー パラメータを配列にすることができます (グループごとに使用して、集約のレベルを制御できます)。

したがって、@ m03geek によって与えられた例には同意しません。異なるキーのリストであってはなりません。間違っている場合は修正してください。

私の仮定: 削減と再削減の両方が同じキーでのみ行われます。

例: reduce は次のようなものです:

1)reduce(keyA, [1,2,3]) これは事前に計算され、Btree 構造に格納されます

2) rereduce(keyA, [6, reduce(keyA, [4,5,6])]), 6 は最初の reduce メソッドの [1,2,3] の合計です。次に、新しいドキュメントを couchbase に追加しますこれにより、reduce メソッドが再度トリガーされます。元の map/reduce のように全体を再度計算するのではなく、couchbase は 6 である btree から事前計算されたデータを取得し、map のキーと値のペアから reduce を実行します。メソッド (新しいドキュメントを追加することによってトリガーされます) を実行し、事前に計算された値 + 新しい値に対して re-reduce を実行します。

于 2015-03-05T03:39:52.437 に答える