Docs Menu
Docs Home
/ / /
Mongoid
/

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メソッドまたはそのエイリアスrawresultsを使用して取得できます。

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: パイプラインを介して読み取り、発行、削減、出力するドキュメントの数。

  • inputemittedreducedoutput : 個々のカウント メソッド。 メソッドと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メソッドを使用して未加工の結果を取得し、未加工の結果から統計情報を取得することを検討してください。

戻る

Aggregation Pipeline