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

集計によるデータの変換

項目一覧

  • Overview
  • 集計操作と検索操作の比較
  • 制限
  • 集計の例
  • 集計パイプラインの構築と実行
  • 集計の説明
  • 詳細情報
  • API ドキュメント

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

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

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

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

検索操作を使用して、次のアクションを実行できます。

  • どのドキュメントを返すかを選ぶ

  • どのフィールドを返すかを選ぶ

  • 結果を並べ替える

集計操作を使用して、次のアクションを実行できます。

  • 検索操作の実行

  • フィールドの名前を変更する

  • フィールドを計算する

  • データを要約する

  • 値をグループ化する

集計操作を使用する場合、次の制限が適用されます。

  • 返されたドキュメントは、 BSON ドキュメント サイズの制限である16メガバイトに違反していない必要があります。

  • パイプライン ステージには、デフォルトで 100 メガバイトのメモリ制限があります。この制限を超えるには、 allowDiskUse オプションを true に設定します。

重要

$graphLookup の例外

$graphLookupステージは100メガバイトという厳格なメモリ制限があり、 allowDiskUseオプションを無視します。

このセクションの例では、 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 」を参照してください。

Cドライバーを使用して集計操作を実行する方法の詳細については、次のAPIドキュメントを参照してください。

戻る

エンタープライズ認証