集計によるデータの変換
Overview
このガイドでは、 Cドライバーを使用して集計操作 を実行する方法を学習できます。
集計操作を使用して MongoDB コレクション内のデータを処理し、計算された結果を返すことができます。 クエリ API の一部である MongoDB 集計フレームワークは、データ処理パイプラインの概念をモデル化したものです。 ドキュメントは 1 つ以上の ステージを含むパイプラインに投入され、各ステージではドキュメントを変換して最終集計結果を出力します。
集計自動車操作は工場に似たものとして考えることができます。 自動車工場の組立ラインには、ドリルや溶接機のような、特定の作業をするための専用工具を備えた組立ステーションがあります。 未加工のパーツが工場に搬入され、組立ラインで完成品に加工、組み立てられます。
集計パイプラインは組み立てライン、集計ステージは組み立てステーション、演算子式は専用ツールです。
集計操作と検索操作の比較
検索操作を使用して、次のアクションを実行できます。
どのドキュメントを返すかを選ぶ
どのフィールドを返すかを選ぶ
結果を並べ替える
集計操作を使用して、次のアクションを実行できます。
検索操作の実行
フィールドの名前を変更する
フィールドを計算する
データを要約する
値をグループ化する
制限
集計操作を使用する場合、次の制限が適用されます。
返されたドキュメントは、 BSON ドキュメント サイズの制限である16メガバイトに違反していない必要があります。
パイプライン ステージには、デフォルトで 100 メガバイトのメモリ制限があります。この制限を超えるには、
allowDiskUse
オプションをtrue
に設定します。
集計の例
このセクションの例では、 Atlas サンプル データセットのsample_restaurants
データベースのrestaurants
コレクションを使用します。 MongoDB Atlas クラスターを無料で作成して、サンプル データセットをロードする方法については、 「 Atlas を使い始める 」ガイドを参照してください。
集計パイプラインの構築と実行
コレクション内のドキュメントに対して集計を実行するには、パイプラインステージを表す bson_t
構造を mongoc_collection_aggregate()
関数に渡します。
この例では、ニューヨーク市の各地区のケーキの数を出力します。次のコードでは、次のステージを含む集計パイプラインが作成されます。
$matchステージで、
cuisine
フィールドの値が"Bakery"
であるドキュメントをフィルタリングします。一致するドキュメントを
borough
フィールドでグループ化し、そのフィールドの個別の値ごとにドキュメントの数を生成する$groupステージ。
const bson_t *doc; bson_t *pipeline = BCON_NEW ("pipeline", "[", "{", "$match", "{", "cuisine", BCON_UTF8 ("Bakery"), "}", "}", "{", "$group", "{", "_id", BCON_UTF8 ("$borough"), "count", "{", "$sum", BCON_INT32 (1), "}", "}", "}", "]"); mongoc_cursor_t *results = mongoc_collection_aggregate (collection, MONGOC_QUERY_NONE, pipeline, NULL, NULL); bson_error_t error; if (mongoc_cursor_error (results, &error)) { fprintf (stderr, "Aggregate failed: %s\n", error.message); } else { while (mongoc_cursor_next (results, &doc)) { char *str = bson_as_canonical_extended_json (doc, NULL); printf ("%s\n", str); bson_free (str); } } bson_destroy (pipeline); mongoc_cursor_destroy (results);
{ "_id" : "Queens", "count" : { "$numberInt" : "204" } } { "_id" : "Staten Island", "count" : { "$numberInt" : "20" } } { "_id" : "Missing", "count" : { "$numberInt" : "2" } } { "_id" : "Bronx", "count" : { "$numberInt" : "71" } } { "_id" : "Brooklyn", "count" : { "$numberInt" : "173" } } { "_id" : "Manhattan", "count" : { "$numberInt" : "221" } }
集計の説明
MongoDBが操作を実行する方法に関する情報を表示するには、パイプラインでexplain
操作を実行します。 MongoDBが操作を説明すると、実行プランとパフォーマンス統計が返されます。実行プランは、 MongoDBが操作を完了できる潜在的な方法です。 MongoDBに操作を説明する ように指示すると、その操作のためにMongoDBが選択したプランと拒否された実行プランの両方が返されます。
次のコード例では、前のセクションと同じ集計を実行しますが、操作の詳細を説明するために mongoc_client_command_simple()
関数を使用しています。
bson_t reply; bson_error_t error; bson_t *command = BCON_NEW ( "aggregate", BCON_UTF8 ("restaurants"), "explain", BCON_BOOL(true), "pipeline", "[", "{", "$match", "{", "cuisine", BCON_UTF8("Bakery"), "}", "}", "{", "$group", "{", "_id", BCON_UTF8("$borough"), "count", "{", "$sum", BCON_INT32(1), "}", "}", "}", "]"); if (mongoc_client_command_simple (client, "sample_restaurants", command, NULL, &reply, &error)) { char *str = bson_as_canonical_extended_json (&reply, NULL); printf ("%s\n", str); bson_free (str); } else { fprintf (stderr, "Command failed: %s\n", error.message); } bson_destroy (command); bson_destroy (&reply);
{ "explainVersion": "2", "queryPlanner": { "namespace": "sample_restaurants.restaurants" "indexFilterSet": false, "parsedQuery": { "cuisine": {"$eq": "Bakery"} }, "queryHash": "865F14C3", "planCacheKey": "0697561B", "optimizedPipeline": true, "maxIndexedOrSolutionsReached": false, "maxIndexedAndSolutionsReached": false, "maxScansToExplodeReached": false, "winningPlan": { ... }, "rejectedPlans": [] ... } ... }
詳細情報
式演算子の完全なリストを表示するには、 マニュアルの「 集計演算子MongoDB Server 」を参照してください。
集計パイプラインの組み立てと例については、 マニュアルの「 集計パイプライン MongoDB Server」を参照してください。
パイプライン ステージの作成の詳細については、 マニュアルの「 集計ステージMongoDB Server 」を参照してください。
MongoDB操作の説明の詳細については、 マニュアルの「 出力 と クエリプラン の説明MongoDB Server 」を参照してください。
API ドキュメント
Cドライバーを使用して集計操作を実行する方法の詳細については、次のAPIドキュメントを参照してください。