[TIL] Aggregation framework(MongoDB)

김민성·2021년 5월 26일
0


Aggregation Framework는 MongoDB에서 데이터를 쿼리하는 방법 중 하나입니다. MongoDB 쿼리 언어를 사용하는 모든 작업은 Aggregation Framework로 대체가 가능합니다.

Syntax

기본적인 문법 형태는

db.컬렉션이름.aggregate([
	{$match:{찾는필드:찾는값}},
	{$project:{찾는필드:찾는값}},
	{$group:{찾는필드:찾는값}}
])

의 형태입니다.

Aggregation Framework는 파이프라인처럼 실행됩니다. 예전에 초등학생 때 흙탕물을 정수하기 위해 페트병에 작은돌부터 큰돌을 순서대로 넣고 물을 정수하면 순서대로 흙탕물이 필터링 되면서 마지막에는 정수된 물이 나오는 실험을 한 적이 있는데요. 이와 같이 작업 순서에 따라 값을 필터링하면서 원하는 값을 정제해 간다고 생각하시면 됩니다. 예시를 보면 $match > $project > $group의 순서대로 값이 정제됩니다. 현재 진행하고 있는 기업협업 프로젝트에서 Aggregation Framework를 사용하여 admin 페이지에 데이터 분석 결과를 나열하는 작업을 하고 있는데, 분석을 할 때 쿼리의 작업 순서를 바꿔보았더니 기존의 원하던 값이랑 다른 결과가 나와서 순간 당황했던 기억이 있습니다ㅎㅎ 순서를 잘 생각해 가면서 코드를 작성해야합니다.

Aggregation Pipeline Stages

다음으로는 Aggregation Pipeline Stages에 대해서 적어보겠습니다. 검색을 해보니 이전까지 제가 작업이라고 불렀던 $match, $project, $group같은 명령어(?)들을 Stage라고 부르는 것 같습니다.(출처:https://docs.mongodb.com/manual/reference/operator/aggregation-pipeline/) 이번에는 제가 협업을 하면서 많이 사용하고 있는 Stages 위주로 적어보겠습니다.

$match

db.컬렉션이름.find(
	{찾는필드:찾는값}
)

db.컬렉션이름.aggregate([
	{$match:{찾는필드:찾는값}},
])

예시처럼 find와 같은 의미를 가집니다.

$project

db.컬렉션이름.find(
	{찾는필드:찾는값},
    {필드1:1, 필드2:1, 필드3:0}
)

db.컬렉션이름.aggregate([
	{$match:{찾는필드:찾는값}},
    {$project:{필드1:1, 필드2:1, 필드3:0}}
])

컬렉션 안에서 내가 출력하고 싶은 필드와 값을 선택할 수 있습니다. 값이 1이라면 필드의 값을 보여주고 0 이면 보여주지 않습니다.

$group

sql에서 groupby와 같은 역할을 할 수있게 해주는 stage입니다.

db.컬렉션이름.aggregate([
	{$match:{찾는필드:찾는값}},
    {$project:{필드1:1, 필드2:1, 필드3:0}},
    {$group:{_id:$필드이름, 합칠 값의 필드이름:{'$sum': 1}}}
])

위의 예시에서 $group의 역할은 _id에 입력한 필드의 개수를 카운트해서 합칠 값의 필드이름으로 출력합니다. 만약 컬렉션에 혈액형이라는 필드에 5명의 사람이 A, A, A, B, B, O라는 혈액형으로 저장되어있습니다. 이경우 group의 _id를 혈액형으로 잡으면 A는 3, B는 2, O는 1로 나옵니다.

$count

db.컬렉션이름.aggregate([
	{$match:{찾는필드:찾는값}},
    {$project:{필드1:1, 필드2:1, 필드3:0}},
    {'$count':'count'}
])

db.컬렉션이름.aggregate([
	{$match:{찾는필드:찾는값}},
    {$project:{필드1:1, 필드2:1, 필드3:0}},
    {$group:{_id:null, count:{'$sum': 1}}}
])

count는 온전히 출력한 도큐먼트들의 개수를 세어줍니다. 위의 예시는 count와 group으로 도큐먼트의 개수를 세어줍니다.

$sort

db.컬렉션이름.aggregate([
	{$match:{찾는필드:찾는값}},
    {$project:{필드1:1, 필드2:1, 필드3:0}},
    {$group:{_id:null, count:{'$sum': 1}}},
    {$sort:{count:-1}}
])

정제된 데이터를 정렬시켜줍니다. -1이 내림차순이고, 1이 오름차순입니다.

profile
https://github.com/alstjd8826

0개의 댓글