Docs Menu
Docs Home
/ / /
C 드라이버
/ /

애그리게이션 프레임워크 예제

이 페이지의 내용

  • 요구 사항:
  • 우편 번호 데이터 세트를 사용한 애그리게이션
  • 인구 10 백만 이상의 주
  • 주별 평균 도시 인구

이 문서 에서는 집계 프레임워크 의 기능을 보여주는 여러 가지 실용적인 예제를 제공합니다.

우편번호 데이터 세트를 사용한 애그리게이션 예제에서는 미국의 모든 우편번호 및 인구에 대해 공개적으로 사용 가능한 데이터 세트 를 사용합니다. 이 데이터는zips.json에서 확인할 수 있습니다.

모두 설치되었는지 확인해 보겠습니다.

다음 명령을 사용하여 mongod 데이터 세트 를 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 로 포함됩니다.

  • 0}city 필드에는 도시 이름이 포함됩니다.

  • state 필드에는 두 글자의 상태 약어가 포함됩니다.

  • 0}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 로 빌드됩니다.

$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 로 빌드됩니다.

첫 번째 $group 연산자는 다음 문서를 생성합니다.

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

$group 연산자는 _id 필드를 제외한 중첩 문서를 사용할 수 없습니다.

두 번째 $group 는 이러한 문서를 사용하여 다음 문서를 생성합니다.

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

이러한 문서는 avg_city_pop 필드 를 기준으로 내림차순으로 정렬됩니다. 마지막으로 $limit 파이프라인 연산자 는 정렬된 설정하다 에서 첫 번째 3 문서를 반환합니다.

돌아가기

대량 쓰기 작업