集計
項目一覧
Overview
このガイドでは、MongoDB .NET/C# ドライバーを使用して集計操作を実行する方法を学習できます。
集計操作により MongoDB コレクション内のデータが処理され、計算結果が返されます。 MongoDB 集計フレームワークは、データ処理パイプラインの概念をモデル化したものです。 ドキュメントは 1 つ以上のステージで構成されるパイプラインに投入され、そこで集計結果に変換されます。
アナロジー
集計操作は、組み立てラインを持つ自動車工場と同様に機能します。 組立ラインには、特定のタスクを実行するための専用ツールを備えたステーションがあります。 たとえば、自動車をビルドする場合、組立ラインは フレームから始まります。 その後、自動車フレームが組み立てラインを通過するにつれて、各ステーションは個別の部分を組み立てます。 その結果は変換された最終製品、完成品です。
組立ラインは集計パイプラインを表し、個々のステーションは集計ステージを表し、専用ツールは式演算子を表し、完成品は集計結果を表します。
集計操作と検索操作の比較
次の表は、集計操作で実行できる操作と比較して、検索操作で実行できるさまざまなタスクを示しています。 集計フレームワークは、データを変換および操作するための拡張機能を提供します。
検索操作 | 集計操作 |
---|---|
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 Group the results Rename fields Compute new fields Summarize data Connect and merge data sets |
サーバーの制限
集計操作を実行する際には、次の制限を考慮してください。
返されるドキュメントは、 16メガバイトのBSON ドキュメント サイズ 制限に違反していない必要があります。
パイプライン ステージには、デフォルトで100 MB のメモリ制限があります。 必要な場合は、
Aggregate()
メソッドに渡すAggregateOptions
オブジェクトの AllowDiskUseプロパティを設定することで、この制限を超えることができます。$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); }
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); }
ビルダーを使用して集計パイプラインを構築する方法の詳細については、「 ビルダによる操作 」の「集計パイプラインの構築 」セクションを参照してください。
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); }
詳細情報
MongoDB Server マニュアル
式演算子の完全なリストを表示するには、「集計演算子 」を参照してください。
集計パイプラインのアセンブルと例についての詳細は、「集計パイプライン 」を参照してください。
パイプライン ステージの作成の詳細については、「集計ステージ 」を参照してください。
MongoDB 集計操作の説明の詳細については、「結果の説明とクエリプランの説明 」を参照してください。
API ドキュメント
このガイドで説明されている集計操作の詳細については、次の API ドキュメントを参照してください。