map-reduce コレクションとシャーディングされたコレクション
注意
map-reduce の代替としての集計パイプライン
MongoDB 5.0以降、 map-reduceは非推奨です。
map-reduceの代わりに、集計パイプラインを使用する必要があります。 集計パイプラインは、map-reduce よりもパフォーマンスとユーザビリティが優れています。
$group
$merge
などの集約パイプライン ステージ を使用して、map-reduce操作を書き換えることができます。カスタム機能を必要とする map-reduce 操作には、
$accumulator
と$function
の集計演算子を使用できます。 これらの演算子を使用して、JavaScript でカスタム集計式を定義できます。
map-reduce を集計パイプラインに置き換える例については、以下を参照してください。
map-reduce は、シャーディングされたコレクションに対して入力と出力の両方で操作をサポートします。 このセクションでは、シャーディングされたコレクションに固有のmapReduce
の動作について説明します。
入力としてのシャーディングされたコレクション
シャーディングされたコレクションを map-reduce 操作の入力として使用する場合、 mongos
は map-reduce ジョブを並列に各シャードに自動的にディスパッチします。 特別なオプションは必要ありません。 mongos
はすべてのシャードのジョブが完了するのを待機します。
出力としてのシャーディングされたコレクション
mapReduce
のout
フィールドにsharded
値がある場合、MongoDB は_id
フィールドをシャードキーとして使用し、出力コレクションをシャーディングします。
シャーディングされたコレクションに出力するには、
出力コレクションが存在しない場合は、まずシャーディングされたコレクションを作成します。
出力コレクションがすでに存在するがシャーディングされていない場合、map-reduce は失敗します。
新しい、または空のシャーディングされたコレクションの場合、MongoDB は map-reduce 操作の最初のステージの結果を使用して、シャード間で分散された初期チャンクを作成します。
mongos
は、map-reduce 後処理ジョブを並行して、チャンクを所有するすべてのシャードにディスパッチします。 後処理中に、各シャードは自分のチャンクの結果を他のシャードからプルし、最後の reduce/ finalize を実行し、 出力コレクションにローカルに書込みます。
注意
後の map-reduce ジョブ中に、MongoDB は必要に応じてチャンクを分割します。
出力コレクションの チャンク のバランシングは、同時実行性の問題を回避するために、後処理中に自動的に阻止されます。