map-reduce
Mongoid は、カスタム map/reduce ジョブまたは単純な集計を実行するために、MongoDB の map/reduce フレームワークに DSL を提供します。
注意
map-reduce 操作は 非推奨です。 集計フレームワークは、map-reduce 操作よりもパフォーマンスとユーザビリティが優れているため、新しい開発に推奨されます。
実行
Mongoid にmap_reduce
クラスまたは基準を指定して map-reduceJavaScript を実行するには、{0 を呼び出し、map および reduce 関数を提供します。
map = %Q{ function() { emit(this.name, { likes: this.likes }); } } reduce = %Q{ function(key, values) { var result = { likes: 0 }; values.forEach(function(value) { result.likes += value.likes; }); return result; } } Band.where(:likes.gt => 100).map_reduce(map, reduce).out(inline: 1)
基準と同様に、map/reduce 呼び出しは遅延評価されます。 したがって、結果を反復処理するか、データベース ヒットを強制するために必要なラッパーで呼び出しを行うまで、データベースにアクセスすることはありません。
Band.map_reduce(map, reduce).out(replace: "mr-results").each do |document| p document # { "_id" => "Tool", "value" => { "likes" => 200 }} end
map/reduce とともに指定する必要があるものは、結果を出力する場所です。 これを指定しない場合、エラーが発生します。 #out
の有効なオプションは次のとおりです。
inline: 1
: 出力をコレクションに保存しないでください。replace: "name"
: 指定された名前のコレクションに保存し、その中のドキュメントを上書きします。merge: "name"
: 指定された名前でコレクションに保存し、その結果を既存のドキュメントとマージします。reduce: "name"
: 指定された名前のコレクションに保存し、そのコレクション内の既存の結果をすべて削減します。
未加工の結果
map-reduce の実行結果は、 execute
メソッドまたはそのエイリアスraw
とresults
を使用して取得できます。
mr = Band.where(:likes.gt => 100).map_reduce(map, reduce).out(inline: 1) mr.execute # => {"results"=>[{"_id"=>"Tool", "value"=>{"likes"=>200.0}}], "timeMillis"=>14, "counts"=>{"input"=>4, "emit"=>4, "reduce"=>1, "output"=>1}, "ok"=>1.0, "$clusterTime"=>{"clusterTime"=>#<BSON::Timestamp:0x00005633c2c2ad20 @seconds=1590105400, @increment=1>, "signature"=>{"hash"=><BSON::Binary:0x12240 type=generic data=0x0000000000000000...>, "keyId"=>0}}, "operationTime"=>#<BSON::Timestamp:0x00005633c2c2aaf0 @seconds=1590105400, @increment=1>}
統計
MongoDB サーバー4.2以前では、map/reduce 実行統計が提供されます。 MongoDB 4.4以降、 map/reduce は集計パイプライン経由で実装されており、このセクションで説明されている統計は利用できません。
次のメソッドはMapReduce
オブジェクトで提供されます。
counts
: パイプラインを介して読み取り、発行、削減、出力するドキュメントの数。input
、emitted
、reduced
、output
: 個々のカウント メソッド。 メソッドとemitted
reduced
メソッドは、counts
のハッシュキーとは異なる名前であることに注意してください。time
: Map/Reduce パイプラインの実行にかかる時間(ミリ秒単位)。
次のコードは、統計を取得する方法を示しています。
mr = Band.where(:likes.gt => 100).map_reduce(map, reduce).out(inline: 1) mr.counts # => {"input"=>4, "emit"=>4, "reduce"=>1, "output"=>1} mr.input # => 4 mr.emitted # => 4 mr.reduced # => 1 mr.output # => 1 mr.time # => 14
注意
統計メソッドを呼び出すごとに、map/reduce パイプラインが再実行されます。 の実行結果は Mongoid によって保存されません。 複数の統計が必要な場合は、 execute
メソッドを使用して未加工の結果を取得し、未加工の結果から統計情報を取得することを検討してください。