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

集計フレームワークの例

項目一覧

  • 要件
  • 郵便番号データセットを使用した集計
  • 人口が10万を超える州
  • 州別の都市の平均人口

このドキュメントでは、 集計フレームワーク の機能を示す多数の実用的な例を示します。

郵便番号データセットを使用した集計の例では、米国のすべての郵便番号と人口を含む公開されているデータセットを使用しています。 このデータは zips.json で入手できます。

すべてがインストールされているかどうかを確認します。

次のコマンドを使用して、zips.json データセットを mongod インスタンスに読み込みます。

$ mongoimport --drop -d test -c zipcodes zips.json

MongoDB shell を使用して、すべてが正常にインポートされたことを確認します。

$ mongo test
connecting to: test
> db.zipcodes.count()
29467
> db.zipcodes.findOne()
{
"_id" : "35004",
"city" : "ACMAR",
"loc" : [
-86.51557,
33.584132
],
"pop" : 6055,
"state" : "AL"
}

このコレクション内の各ドキュメントの形式は次のとおりです。

{
"_id" : "35004",
"city" : "Acmar",
"state" : "AL",
"pop" : 6055,
"loc" : [-86.51557, 33.584132]
}

これらのドキュメントでは、

  • _idフィールドには、郵便番号が string として保持されます。

  • city フィールドには、都市名が保持されます。

  • state フィールドには 2 文字の州の略称が保持されます。

  • pop フィールドには人口が保持されます。

  • locフィールドには、ロケーションが[latitude, longitude]配列として保持されます。

人口が10万を超えるすべての州を取得するには、次の集計パイプラインを使用します。

集計1 .c
#include <mongoc/mongoc.h>
#include <stdio.h>
static void
print_pipeline (mongoc_collection_t *collection)
{
mongoc_cursor_t *cursor;
bson_error_t error;
const bson_t *doc;
bson_t *pipeline;
char *str;
pipeline = BCON_NEW ("pipeline",
"[",
"{",
"$group",
"{",
"_id",
"$state",
"total_pop",
"{",
"$sum",
"$pop",
"}",
"}",
"}",
"{",
"$match",
"{",
"total_pop",
"{",
"$gte",
BCON_INT32 (10000000),
"}",
"}",
"}",
"]");
cursor = mongoc_collection_aggregate (collection, MONGOC_QUERY_NONE, pipeline, NULL, NULL);
while (mongoc_cursor_next (cursor, &doc)) {
str = bson_as_canonical_extended_json (doc, NULL);
printf ("%s\n", str);
bson_free (str);
}
if (mongoc_cursor_error (cursor, &error)) {
fprintf (stderr, "Cursor Failure: %s\n", error.message);
}
mongoc_cursor_destroy (cursor);
bson_destroy (pipeline);
}
int
main (void)
{
mongoc_client_t *client;
mongoc_collection_t *collection;
const char *uri_string = "mongodb://localhost:27017/?appname=aggregation-example";
mongoc_uri_t *uri;
bson_error_t error;
mongoc_init ();
uri = mongoc_uri_new_with_error (uri_string, &error);
if (!uri) {
fprintf (stderr,
"failed to parse URI: %s\n"
"error message: %s\n",
uri_string,
error.message);
return EXIT_FAILURE;
}
client = mongoc_client_new_from_uri (uri);
if (!client) {
return EXIT_FAILURE;
}
mongoc_client_set_error_api (client, 2);
collection = mongoc_client_get_collection (client, "test", "zipcodes");
print_pipeline (collection);
mongoc_uri_destroy (uri);
mongoc_collection_destroy (collection);
mongoc_client_destroy (client);
mongoc_cleanup ();
return EXIT_SUCCESS;
}

次のような結果が表示されます。

{ "_id" : "PA", "total_pop" : 11881643 }
{ "_id" : "OH", "total_pop" : 10847115 }
{ "_id" : "NY", "total_pop" : 17990455 }
{ "_id" : "FL", "total_pop" : 12937284 }
{ "_id" : "TX", "total_pop" : 16986510 }
{ "_id" : "IL", "total_pop" : 11430472 }
{ "_id" : "CA", "total_pop" : 29760021 }

上記の集計パイプラインは、 $group$matchの 2 つのパイプライン演算子から構築されています。

$groupパイプライン演算子には、グループ化を指定する _id フィールドが必要です。残りのフィールドは複合値の生成方法を指定し、次のいずれかのグループ集計関数を使用する必要があります。 $addToSet$first$last$max$min$avg$push$sum$matchパイプライン演算子の構文は 読み取り操作クエリの構文 と同じです。

$groupプロセスはすべてのドキュメントを読み取り、各州に対して個別のドキュメントを作成します。次に例を示します。

{ "_id" : "WA", "total_pop" : 4866692 }

total_popフィールドは $sum 集計関数を使用して、ソース ドキュメント内のすべてのポップ フィールドの値を合計します。

$groupによって作成されたドキュメントは、 $matchパイプライン演算子にパイプラインされます。 total_popフィールドの値が10万以上のドキュメントを返します。

都市あたりの平均人口が最も多い最初の 3 つの州を取得するには、次の集計を使用します。

pipeline = BCON_NEW ("pipeline", "[",
"{", "$group", "{", "_id", "{", "state", "$state", "city", "$city", "}", "pop", "{", "$sum", "$pop", "}", "}", "}",
"{", "$group", "{", "_id", "$_id.state", "avg_city_pop", "{", "$avg", "$pop", "}", "}", "}",
"{", "$sort", "{", "avg_city_pop", BCON_INT32 (-1), "}", "}",
"{", "$limit", BCON_INT32 (3) "}",
"]");

この集計パイプラインでは次の生成が行われます。

{ "_id" : "DC", "avg_city_pop" : 303450.0 }
{ "_id" : "FL", "avg_city_pop" : 27942.29805615551 }
{ "_id" : "CA", "avg_city_pop" : 27735.341099720412 }

上記の集計パイプラインは、 $group$sort$limitの 3 つのパイプライン演算子から構築されています。

最初の$group演算子は、次のドキュメントを作成します。

{ "_id" : { "state" : "WY", "city" : "Smoot" }, "pop" : 414 }

ただし、 $group演算子は_idフィールド以外のネストされたドキュメントを使用できません。

2 番目の$groupは、これらのドキュメントを使用して次のドキュメントを作成します。

{ "_id" : "FL", "avg_city_pop" : 27942.29805615551 }

これらのドキュメントはavg_city_popフィールドの降順でソートされます。 最後に、 $limitパイプライン演算子は、ソートされたセットから最初の3ドキュメントを返します。

戻る

一括書き込み操作