集計フレームワークの例
このドキュメントでは、 集計フレームワーク の機能を示す多数の実用的な例を示します。
郵便番号データセットを使用した集計の例では、米国のすべての郵便番号と人口を含む公開されているデータセットを使用しています。 このデータは 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万を超える州
人口が10万を超えるすべての州を取得するには、次の集計パイプラインを使用します。
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ドキュメントを返します。