Overview
このガイドでは、 Rubyドライバーを使用して集計操作を実行する方法を学習できます。
集計操作により MongoDB コレクション内のデータが処理され、計算結果が返されます。 クエリ API の一部である MongoDB 集計フレームワークは、データ処理パイプラインの概念をモデル化したものです。 ドキュメントは 1 つ以上の ステージを含むパイプラインに投入され、そこで集計結果に変換されます。
Tip
完全な集計チュートリアル
サーバー マニュアルの「完全な集計パイプライン チュートリアル」のセクションには、一般的な集計タスクの詳細を説明するチュートリアルがあります。チュートリアルを選択し、ページの右上隅にある Select your language ドロップダウン メニューから Ruby を選択します。
アナロジー
集計操作は自動車工場に似ています。工場内の組立ラインには、ドリルや溶接機のような、特定の作業をするための専用工具を備えた組立ステーションがあります。未加工のパーツが工場に搬入され、組立ラインで完成品に加工、組み立てられます。
集計パイプラインは組み立てライン、集計ステージは組み立てステーション、演算子式は専用ツールです。
集計操作と検索操作の比較
次の表は、検索操作が実行できるさまざまなタスクを示し、それらを集計操作と比較しています。 集計フレームワークは、データを変換および操作するための拡張機能を提供します。
検索操作 | 集計操作 |
|---|---|
返す特定のドキュメントを選択して返す |
|
制限
集計操作を実行する際には、次の制限を考慮してください。
返されたドキュメントは、 16メガバイトのBSONドキュメントサイズ制限に違反することはできません。
パイプライン ステージには、デフォルトで 100 メガバイトのメモリ制限があります。 この制限を超えるには、
trueの値をallow_disk_useメソッドに渡し、そのメソッドをaggregateにチェーンします。$graphLookup 演算子には、 MB100 の厳格なメモリ制限があり、
allow_disk_useメソッドに渡される値を無視します。
集計操作の実行
注意
サンプル データ
このガイドの例では、 Atlas サンプル データセットのsample_restaurantsデータベースのrestaurantsコレクションを使用します。 MongoDB Atlas クラスターを無料で作成して、サンプル データセットをロードする方法については、 「 Atlas を使い始める 」ガイドを参照してください。
集計 を実行するには、各パイプラインステージをRuby hash として定義し、操作のパイプラインをaggregate メソッドに渡します。
集計の例
次のコード例では、ニューヨークの各地区のケーキの数のカウントを生成します。 そのために、次のステージを持つ集計パイプラインを使用します。
$matchステージで、
cuisineフィールドに値"Bakery"が含まれるドキュメントをフィルタリングします。一致するドキュメントを
boroughフィールドでグループ化し、個別の 値ごとにドキュメントの数を累積する$groupステージ。
database = client.use('sample_restaurants') restaurants_collection = database[:restaurants] pipeline = [ { '$match' => { 'cuisine' => 'Bakery' } }, { '$group' => { '_id' => '$borough', 'count' => { '$sum' => 1 } } } ] aggregation = restaurants_collection.aggregate(pipeline) aggregation.each do |doc| puts doc end
{"_id"=>"Bronx", "count"=>71} {"_id"=>"Manhattan", "count"=>221} {"_id"=>"Queens", "count"=>204} {"_id"=>"Missing", "count"=>2} {"_id"=>"Staten Island", "count"=>20} {"_id"=>"Brooklyn", "count"=>173}
集計の説明
MongoDB が操作を実行する方法に関する情報を表示するには、 MongoDBクエリ プランナーにそれを説明するように指示できます。MongoDB が操作を説明すると、実行プランとパフォーマンス統計が返されます。実行プランは、 MongoDB が操作を完了できる潜在的な方法です。MongoDB に操作を説明するよう指示すると、 MongoDBが実行したプランと拒否された実行プランの両方がデフォルトで返されます。
集計操作を説明するには、explain メソッドを aggregate メソッドに連鎖させます。
次の例では、 MongoDBに、前述の集計の例の集計操作を説明するように指示します。
explanation = restaurants_collection.aggregate(pipeline).explain() puts explanation
{"explainVersion"=>"2", "queryPlanner"=>{"namespace"=>"sample_restaurants.restaurants", "parsedQuery"=>{"cuisine"=> {"$eq"=> "Bakery"}}, "indexFilterSet"=>false, "planCacheKey"=>"6104204B", "optimizedPipeline"=>true, "maxIndexedOrSolutionsReached"=>false, "maxIndexedAndSolutionsReached"=>false, "maxScansToExplodeReached"=>false, "prunedSimilarIndexes"=>false, "winningPlan"=>{"isCached"=>false, "queryPlan"=>{"stage"=>"GROUP", "planNodeId"=>3, "inputStage"=>{"stage"=>"COLLSCAN", "planNodeId"=>1, "filter"=>{}, "direction"=>"forward"}},...}
全文検索を実行する
1つ以上のフィールドの全文検索を指定するには、MongoDB 検索するを使用して $searchパイプラインステージを作成します。
この例では、次のアクションを実行するためのパイプラインステージを作成しています。
nameフィールドで"Salt"というタームを検索一致するドキュメントの
_idとnameの値のみをプロジェクションする
重要
次の例を実行するには、nameフィールドをカバーするrestaurantsコレクションにMongoDB検索インデックスを作成する必要があります。次に、"<your_search_index_name>" プレースホルダーをインデックスの名前に置き換えます。MongoDB 検索インデックスの作成方法については、MongoDB Search と MongoDB ベクトル検索インデックスのガイドを参照してください。
search_pipeline = [ { '$search' => { 'index' => '<your_search_index_name>', 'text' => { 'query' => 'Salt', 'path' => 'name' }, } }, { '$project' => { '_id' => 1, 'name' => 1 } } ] results = collection.aggregate(search_pipeline) results.each do |document| puts document end
{"_id"=> {"$oid"=> "..."}, "name"=> "Fresh Salt"} {"_id"=> {"$oid"=> "..."}, "name"=> "Salt & Pepper"} {"_id"=> {"$oid"=> "..."}, "name"=> "Salt + Charcoal"} {"_id"=> {"$oid"=> "..."}, "name"=> "A Salt & Battery"} {"_id"=> {"$oid"=> "..."}, "name"=> "Salt And Fat"} {"_id"=> {"$oid"=> "..."}, "name"=> "Salt And Pepper Diner"}
詳細情報
MongoDB Server マニュアル
このガイドで説明されているトピックについて詳しくは、 MongoDB Serverマニュアルの次のページ を参照してください。
集計ステージの完全なリストについては、MongoDB Serverマニュアルの集計ステージを参照してください。
集計パイプラインの組み立てと例については、「集計パイプライン 」を参照してください。
パイプライン ステージの作成の詳細については、「集計ステージ 」を参照してください。
MongoDB 操作の説明の詳細については、「出力とクエリ プランの説明 」を参照してください。
API ドキュメント
Rubyドライバーの集計メソッド の詳細については、集計 のAPIドキュメントを参照してください。