우편 번호 데이터 세트를 사용한 집계
이 문서의 예시에서는 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
필드에는 위치가 경도 위도 쌍 형태로 포함됩니다.
aggregate()
메서드
다음 예시는 모두 mongosh
에서 aggregate()
헬퍼를 사용합니다.
aggregate()
메서드는 집계 파이프라인을 사용하여 문서를 집계된 결과로 처리합니다. 집계 파이프라인은 여러 단계로 구성되며, 각 단계는 문서가 파이프라인을 통과할 때 처리합니다. 문서는 순서대로 단계를 통과합니다.
mongosh
의 aggregate()
메서드는 aggregate
데이터베이스 명령에 대한 래퍼(wrapper)를 제공합니다. 데이터 집계 작업을 위한 더욱 관용적인 인터페이스는 드라이버 설명서를 참조하세요.
인구가 1,000만 명 이상인 주 반환
다음 집계 작업은 총 인구가 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
단계에서는city
와state
의 조합으로 문서를 그룹화하고,$sum
표현식을 사용하여 각 조합의 인구를 계산한 다음,city
와state
의 조합에 대해 각각 문서를 출력합니다. [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
단계에서는city
와state
의 조합에 따라 문서를 그룹화하고, 각 조합에 대해pop
값의sum
을 계산한 다음,city
와state
의 각 조합에 대해 문서를 출력합니다.파이프라인의 이 단계에서 문서는 다음과 유사합니다.
{ "_id" : { "state" : "CO", "city" : "EDGEWATER" }, "pop" : 13154 } $sort
단계에서는 파이프라인의 문서를pop
필드 값에 따라 가장 작은 것부터 가장 큰 것까지 오름차순으로 정렬합니다. 이 작업으로 문서가 변경되지는 않습니다.다음
$group
단계에서는_id.state
필드(예:_id
문서 내의state
필드)별로 현재 정렬된 문서를 그룹화하고 각 주에 대한 문서를 출력합니다.또한 이 단계에서는 각 주에 대해 다음 네 가지 필드를 계산합니다.
$last
표현식을 사용하여$group
연산자는 인구가 가장 많은 도시와 해당 인구를 저장하는biggestCity
및biggestPop
필드를 생성합니다.$first
표현식을 사용하여$group
연산자는 인구가 가장 적은 도시와 해당 인구를 저장하는smallestCity
및smallestPop
필드를 생성합니다.파이프라인의 이 단계에서 문서는 다음과 유사합니다.
{ "_id" : "WA", "biggestCity" : "SEATTLE", "biggestPop" : 520096, "smallestCity" : "BENGE", "smallestPop" : 2 } 마지막
$project
단계에서는_id
필드의 이름을state
로 변경하고biggestCity
,biggestPop
,smallestCity
및smallestPop
을biggestCity
및smallestCity
가 내장된 문서로 이동합니다.
이 집계 작업의 출력 문서는 다음과 같습니다.
{ "state" : "RI", "biggestCity" : { "name" : "CRANSTON", "pop" : 176404 }, "smallestCity" : { "name" : "CLAYVILLE", "pop" : 45 } }
[1] | 도시의 구역마다 우편번호가 다를 수 있으므로 도시마다 우편번호가 두 개 이상 있을 수 있습니다. |