キーと対応するすべての値を使用して、reduce関数を1回呼び出すことができます。 (ただし、キーに複数の値がある場合に限ります。キーに値が1つしかない場合は、まったく呼び出されません)。
また、キーと対応する値のサブセットのみを使用して、複数回呼び出すこともできます。 、および前のreduceの結果はそのキーです。このシナリオは、再削減と呼ばれます 。再リデュースをサポートするには、リデュース機能がべき等である必要があります。
べき等削減機能には、次の2つの重要な機能があります。
- 戻り値 削減機能の値と同じ形式である必要があります したがって、reduce関数が文字列の配列を受け入れる場合、関数は文字列を返す必要があります。複数のプロパティを持つオブジェクトを受け入れる場合は、それらの同じプロパティを含むオブジェクトを返す必要があります。これにより、以前のreduceの結果で呼び出されたときに関数が壊れないことが保証されます。
- 値の数に基づいて推測しないでください
values
が保証されるわけではありません。 パラメータにはすべてが含まれます 指定されたキーの値。したがって、values.length
を使用します 計算は非常に危険であり、避ける必要があります。
更新: 最近のMongoDBリリースでは、以下の2つの手順は必要ありません(または、可能ですが、チェックしていません)。 map-reduceオプションで出力コレクションを指定すると、これらの手順を処理できるようになります。
{ out: { reduce: "tempResult" } }
リデュース機能がべき等である場合、複数のコレクションをマップリデュースすることに問題はありません。各コレクションの結果を再削減するだけです:
ステップ1
必要なコレクションごとにmap-reduceを実行し、結果を単一の一時的なコレクションに保存します。ファイナライズ関数を使用して結果を保存できます:
finalize = function (key, value) {
db.tempResult.save({ _id: key, value: value });
}
db.someCollection.mapReduce(map, reduce, { finalize: finalize })
db.anotherCollection.mapReduce(map, reduce, { finalize: finalize })
ステップ2
別のmap-reduceを一時コレクションで実行し、同じreduce関数を使用 。マップ関数は、一時的なコレクションからキーと値を選択する単純な関数です。
map = function () {
emit(this._id, this.value);
}
db.tempResult.mapReduce(map, reduce)
この2番目のmap-reduceは基本的にre-reduceであり、必要な結果が得られるはずです。