Overview
このガイドでは、MongoDB .NET/C# ドライバーを使用して集計操作を実行する方法を学習できます。
集計操作により MongoDB コレクション内のデータが処理され、計算結果が返されます。 MongoDB 集計フレームワークは、データ処理パイプラインの概念をモデル化したものです。 ドキュメントは 1 つ以上のステージで構成されるパイプラインに投入され、そこで集計結果に変換されます。
アナロジー
集計操作は、組み立てラインを持つ自動車工場と同様に機能します。 組立ラインには、特定のタスクを実行するための専用ツールを備えたステーションがあります。 たとえば、自動車をビルドする場合、組立ラインは フレームから始まります。 その後、自動車フレームが組み立てラインを通過するにつれて、各ステーションは個別の部分を組み立てます。 その結果は変換された最終製品、完成品です。
組立ラインは集計パイプラインを表し、個々のステーションは集計ステージを表し、専用ツールは式演算子を表し、完成品は集計結果を表します。
集計操作と検索操作の比較
次の表は、集計操作で実行できる操作と比較して、検索操作で実行できるさまざまなタスクを示しています。 集計フレームワークは、データを変換および操作するための拡張機能を提供します。
検索操作 | 集計操作 |
|---|---|
返す特定のドキュメントを選択して返す | 返す特定のドキュメントを選択して返す |
サーバーの制限
集計操作を実行する際には、次の制限を考慮してください。
返されるドキュメントは、 16メガバイトのBSON ドキュメント サイズ 制限に違反していない必要があります。
$graphLookupステージは100メガバイトという厳格なメモリ制限があり、
AllowDiskUseプロパティを無視します。
集計の例
集計を実行するには、集計ステージのリストを IMongoCollection<TDocument>.Aggregate() メソッドに渡します。
注意
この例では、 Atlas サンプル データセットのsample_restaurants.restaurantsコレクションを使用します。 MongoDB Atlas クラスターを無料で作成して、サンプル データセットをロードする方法については、クイック スタート を参照してください。
次のコード例では、ニューヨーク市の各地区のケーキの数のカウントを生成します。 そのために、次のステージを含む 集計パイプライン を使用します。
$matchステージで、
cuisineフィールドに値"Bakery"が含まれるドキュメントをフィルタリングします。一致するドキュメントを
boroughフィールドでグループ化し、そのフィールドの個別の値ごとにドキュメントの数を累積する$groupステージ。
次のセクションでは、LINQ、Builder、BsonDocument アプローチを使用してサンプル パイプラインで使用される集計ステージを作成および組み合わせて、この例を実装します。
LINQ アプローチ
// Defines a queryable collection object as a prerequisite to using LINQ var queryableCollection = collection.AsQueryable(); // Defines the query with $match and $group stages var query = queryableCollection .Where(r => r.Cuisine == "Bakery") .GroupBy(r => r.Borough) .Select(g => new { _id = g.Key, Count = g.Count() }); // Executes the query and prints the aggregated results foreach (var result in query.ToList()) { Console.WriteLine(result); }
{ _id = Bronx, Count = 71 } { _id = Brooklyn, Count = 173 } { _id = Staten Island, Count = 20 } { _id = Missing, Count = 2 } { _id = Manhattan, Count = 221 } { _id = Queens, Count = 204 }
LINQ を使用して集計パイプラインを構築する方法の詳細については、「集計操作の LINQシンタックス」ガイドを参照してください。
ビルダーのアプローチ
// Defines the $match aggregation stage var matchFilter = Builders<Restaurant>.Filter.Eq(r => r.Cuisine, "Bakery"); // Defines the aggregation pipeline with the $match and $group aggregation stages var pipeline = new EmptyPipelineDefinition<Restaurant>() .Match(matchFilter) .Group(r => r.Borough, g => new { _id = g.Key, Count = g.Count() } ); // Executes the aggregation pipeline var results = collection.Aggregate(pipeline).ToList(); // Prints the aggregated results foreach (var result in results) { Console.WriteLine(result); }
{ _id = Bronx, Count = 71 } { _id = Brooklyn, Count = 173 } { _id = Staten Island, Count = 20 } { _id = Missing, Count = 2 } { _id = Manhattan, Count = 221 } { _id = Queens, Count = 204 }
ビルダーを使用して集計パイプラインを構築する方法の詳細については、「 ビルダによる操作 」の「集計パイプラインの構築 」セクションを参照してください。
BsonDocument のアプローチ
// Defines the $match and $group aggregation stages var matchStage = new BsonDocument { { "$match", new BsonDocument { { "cuisine", "Bakery" } } } }; var groupStage = new BsonDocument { { "$group", new BsonDocument { { "_id", "$borough" }, { "count", new BsonDocument("$sum", 1) } } } }; // Executes the aggregation pipeline var pipeline = new[] { matchStage, groupStage }; var results = collection.Aggregate<BsonDocument>(pipeline).ToList(); // Prints the aggregated results foreach (BsonDocument result in results) { Console.WriteLine(result); }
{ "_id" : "Brooklyn", "count" : 173 } { "_id" : "Manhattan", "count" : 221 } { "_id" : "Bronx", "count" : 71 } { "_id" : "Missing", "count" : 2 } { "_id" : "Staten Island", "count" : 20 } { "_id" : "Queens", "count" : 204 }
詳細情報
MongoDB Server マニュアル
集計ステージの完全なリストについては、MongoDB Serverマニュアルの集計ステージを参照してください。
集計パイプラインのアセンブルと例についての詳細は、「集計パイプライン 」を参照してください。
パイプライン ステージの作成の詳細については、「集計ステージ 」を参照してください。
MongoDB 集計操作の説明の詳細については、「結果の説明とクエリプランの説明 」を参照してください。
API ドキュメント
このガイドで説明されている集計操作の詳細については、次の API ドキュメントを参照してください。