Docs Menu
Docs Home
/ / /
Ruby ドライバー

集計によるデータの変換

このガイドでは、 Rubyドライバーを使用して集計操作 を実行する方法を学習できます。

集計操作により MongoDB コレクション内のデータが処理され、計算結果が返されます。 クエリ API の一部である MongoDB 集計フレームワークは、データ処理パイプラインの概念をモデル化したものです。 ドキュメントは 1 つ以上の ステージを含むパイプラインに投入され、そこで集計結果に変換されます。

Tip

完全な集計チュートリアル

一般的な集計タスクの詳細を説明するチュートリアルは、サーバー マニュアルの 完全な集計パイプライン チュートリアルRuby Select your languageのセクションで確認できます。チュートリアルを選択し、ページの右上隅にある ドロップダウン メニューから を選択します。

集計操作は自動車工場に似ています。工場内の組立ラインには、ドリルや溶接機のような、特定の作業をするための専用工具を備えた組立ステーションがあります。未加工のパーツが工場に搬入され、組立ラインで完成品に加工、組み立てられます。

集計パイプラインは組み立てライン、集計ステージは組み立てステーション、演算子式は専用ツールです。

次の表は、検索操作が実行できるさまざまなタスクを示し、それらを集計操作と比較しています。 集計フレームワークは、データを変換および操作するための拡張機能を提供します。

検索操作
集計操作
Select certain documents to return
Select which fields to return
Sort the results
Limit the results
Count the results
Select certain documents to return
Select which fields to return
Sort the results
Limit the results
Count the results
Rename fields
Compute new fields
Summarize data
Connect and merge data sets

集計操作を実行する際には、次の制限を考慮してください。

  • 返されたドキュメントは、 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"}},...}

注意

Atlas Search インデックスを持つコレクションでのみ使用可能

この集計パイプライン演算子は、Atlas Searchインデックスを持つコレクションでのみ使用できます。

1 つ以上のフィールドの全文検索を指定するには、$searchパイプラインステージを作成します。

この例では、次のアクションを実行するためのパイプラインステージを作成しています。

  • nameフィールドで "Salt" というタームを検索

  • 一致するドキュメントの _idname の値のみをプロジェクションする

重要

次の例を実行するには、 フィールドをカバーするrestaurants コレクションに Atlas Searchインデックスを作成する必要があります。次に、name "<your_search_index_name>"プレースホルダーをインデックスの名前に置き換えます。 Atlas Searchインデックスの作成方法については、「 Atlas Search インデックスガイド 」を参照してください。

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マニュアルの次のページ を参照してください。

Rubyドライバーの集計メソッド の詳細については、 集計 のAPIドキュメントを参照してください。

戻る

クラスター モニタリング

項目一覧