Docs Menu
Docs Home
/
MongoDB 매뉴얼
/ /

우편 번호 데이터 세트를 사용한 집계

이 페이지의 내용

  • 데이터 모델
  • aggregate() 메서드
  • 인구가 1,000만 명 이상인 주 반환
  • 주별 평균 도시 인구 반환
  • 주별 최대 및 최소 도시 반환

이 문서의 예시에서는 zipcodes 컬렉션을 사용합니다. 이 컬렉션은 다음에서 액세스할 수 있습니다.: media.mongodb.org/zips.json. mongoimport를 사용하여 이 데이터 세트를 mongod 인스턴스에 로드합니다.

zipcodes 컬렉션의 각 문서는 다음과 같은 형식을 갖습니다.

{
"_id": "10280",
"city": "NEW YORK",
"state": "NY",
"pop": 5574,
"loc": [
-74.016323,
40.710537
]
}
  • _id 필드에는 우편 번호가 문자열로 포함됩니다.

  • 0}city 필드에는 도시 이름이 포함됩니다. 도시의 구역마다 우편번호가 다를 수 있으므로 도시마다 우편번호가 두 개 이상 있을 수 있습니다.

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

  • 0}pop 필드에는 인구가 포함됩니다.

  • loc 필드에는 위치가 경도 위도 쌍 형태로 포함됩니다.

다음 예시는 모두 mongosh에서 aggregate() 헬퍼를 사용합니다.

aggregate() 메서드는 집계 파이프라인을 사용하여 문서를 집계된 결과로 처리합니다. 집계 파이프라인여러 단계로 구성되며, 각 단계는 문서가 파이프라인을 통과할 때 처리합니다. 문서는 순서대로 단계를 통과합니다.

mongoshaggregate() 메서드는 aggregate 데이터베이스 명령에 대한 래퍼(wrapper)를 제공합니다. 데이터 집계 작업을 위한 더욱 관용적인 인터페이스는 드라이버 설명서를 참조하세요.

다음 집계 작업은 총 인구가 1,000만 명을 넘는 모든 주를 반환합니다.

db.zipcodes.aggregate( [
{ $group: { _id: "$state", totalPop: { $sum: "$pop" } } },
{ $match: { totalPop: { $gte: 10*1000*1000 } } }
] )

이 예시에서 집계 파이프라인$group 단계와 그 이후의 $match 단계로 구성됩니다.

  • $group 단계에서는 zipcode 컬렉션의 문서를 state 필드별로 그룹화하고, 각 주에 대해 totalPop 필드를 계산한 다음, 각 고유 주에 대한 문서를 출력합니다.

    새 주별 문서에는 _id 필드와 totalPop 필드의 두 가지 필드가 있습니다. _id 필드에는 state의 값, 즉 필드별 그룹이 포함되어 있습니다. totalPop 필드는 각 주의 총 인구를 포함하는 계산된 필드입니다. 이 값을 계산하기 위해 $group$sum 연산자를 사용하여 각 주에 대한 인구 필드(pop)를 추가합니다.

    $group 단계 후 파이프라인의 문서는 다음과 같습니다.

    {
    "_id" : "AK",
    "totalPop" : 550043
    }
  • $match 단계에서는 이러한 그룹화된 문서를 필터링하여 totalPop 값이 1,000만 이상인 문서만 출력합니다. $match 단계는 일치하는 문서를 변경하지 않고 수정하지 않은 상태로 출력합니다.

이 집계 작업에 해당하는 SQL은 다음과 같습니다.

SELECT state, SUM(pop) AS totalPop
FROM zipcodes
GROUP BY state
HAVING totalPop >= (10*1000*1000)

다음도 참조하세요.

다음 집계 작업은 각 주의 도시에 해당하는 평균 인구를 반환합니다.

db.zipcodes.aggregate( [
{ $group: { _id: { state: "$state", city: "$city" }, pop: { $sum: "$pop" } } },
{ $group: { _id: "$_id.state", avgCityPop: { $avg: "$pop" } } }
] )

이 예시에서 집계 파이프라인$group 단계와 그 이후의 또 다른 $group 단계로 구성됩니다.

  • 첫 번째 $group 단계에서는 citystate의 조합으로 문서를 그룹화하고, $sum 표현식을 사용하여 각 조합의 인구를 계산한 다음, citystate의 조합에 대해 각각 문서를 출력합니다. [1]

    파이프라인에서 이 단계가 끝나면 문서는 다음과 유사합니다.

    {
    "_id" : {
    "state" : "CO",
    "city" : "EDGEWATER"
    },
    "pop" : 13154
    }
  • 두 번째 $group 단계에서는 파이프라인의 문서를 _id.state 필드(즉, _id 문서 내의 state 필드)별로 그룹화하고, $avg 표현식을 사용하여 각 주에 대한 평균 도시 인구(avgCityPop)를 계산하여 각 주에 대한 문서를 출력합니다.

이 집계 작업의 결과로 생성된 문서는 다음과 유사합니다.

{
"_id" : "MN",
"avgCityPop" : 5335
}

다음도 참조하세요.

다음 집계 작업은 각 주의 인구별로 가장 작은 도시와 가장 큰 도시를 반환합니다.

db.zipcodes.aggregate( [
{ $group:
{
_id: { state: "$state", city: "$city" },
pop: { $sum: "$pop" }
}
},
{ $sort: { pop: 1 } },
{ $group:
{
_id : "$_id.state",
biggestCity: { $last: "$_id.city" },
biggestPop: { $last: "$pop" },
smallestCity: { $first: "$_id.city" },
smallestPop: { $first: "$pop" }
}
},
// the following $project is optional, and
// modifies the output format.
{ $project:
{ _id: 0,
state: "$_id",
biggestCity: { name: "$biggestCity", pop: "$biggestPop" },
smallestCity: { name: "$smallestCity", pop: "$smallestPop" }
}
}
] )

이 예시에서 집계 파이프라인$group 단계, $sort 단계, 또 다른 $group 단계 및 $project 단계로 구성됩니다.

  • 첫 번째 $group 단계에서는 citystate의 조합에 따라 문서를 그룹화하고, 각 조합에 대해 pop 값의 sum을 계산한 다음, citystate의 각 조합에 대해 문서를 출력합니다.

    파이프라인의 이 단계에서 문서는 다음과 유사합니다.

    {
    "_id" : {
    "state" : "CO",
    "city" : "EDGEWATER"
    },
    "pop" : 13154
    }
  • $sort 단계에서는 파이프라인의 문서를 pop 필드 값에 따라 가장 작은 것부터 가장 큰 것까지 오름차순으로 정렬합니다. 이 작업으로 문서가 변경되지는 않습니다.

  • 다음 $group 단계에서는 _id.state 필드(예: _id 문서 내의 state 필드)별로 현재 정렬된 문서를 그룹화하고 각 주에 대한 문서를 출력합니다.

    또한 이 단계에서는 각 주에 대해 다음 네 가지 필드를 계산합니다. $last 표현식을 사용하여 $group 연산자는 인구가 가장 많은 도시와 해당 인구를 저장하는 biggestCitybiggestPop 필드를 생성합니다. $first 표현식을 사용하여 $group 연산자는 인구가 가장 적은 도시와 해당 인구를 저장하는 smallestCitysmallestPop 필드를 생성합니다.

    파이프라인의 이 단계에서 문서는 다음과 유사합니다.

    {
    "_id" : "WA",
    "biggestCity" : "SEATTLE",
    "biggestPop" : 520096,
    "smallestCity" : "BENGE",
    "smallestPop" : 2
    }
  • 마지막 $project 단계에서는 _id 필드의 이름을 state로 변경하고 biggestCity, biggestPop, smallestCitysmallestPopbiggestCitysmallestCity가 내장된 문서로 이동합니다.

이 집계 작업의 출력 문서는 다음과 같습니다.

{
"state" : "RI",
"biggestCity" : {
"name" : "CRANSTON",
"pop" : 176404
},
"smallestCity" : {
"name" : "CLAYVILLE",
"pop" : 45
}
}
[1] 도시의 구역마다 우편번호가 다를 수 있으므로 도시마다 우편번호가 두 개 이상 있을 수 있습니다.

돌아가기

샤드 컬렉션