반갑습니다!
저번 포스트에서 sample_mflix 데이터를 Import 했는데요 ^^
해당 데이터베이스에는 여러 영화와 관련된 정보가 포함되어 있습니다
영화 정보, 배우, 감독, 영화 리뷰 등에 대한 내용들인데요 ^^
그 중에서 실습에서 주요하게 사용할 컬렉션과 필드의 의미는 다음과 같습니다
1. movies 컬렉션
①_id : 각 영화의 고유 식별 ID값
②title : 영화의 제목
③plot : 영화의 줄거리
④genres : 영화의 장르(ex 액션, 코미디 등)
⑤runtime : 영화의 상영 시간(분 단위)
⑥cast : 영화 출연 배우
⑦directors : 영화 감독
⑧year : 영화가 개봉한 년도
2. comments 컬렉션
①_id : 각 댓글의 고유 식별자
②name : 댓글을 남긴 사용자의 이름
③email : 댓글을 남긴 사용자의 이메일
④movie_id : 댓글이 남겨진 영화의 식별자
⑤text : 댓글의 내용
⑥date : 댓글이 작성된 날짜
이제 본격적으로 Aggregation에 대해서 알아보도록 하겠습니다 ^^
해당 작업에 대해 aggregate() 메소드를 사용하는데요
이 메소드는 MongoDB의 Aggregation 작업을 수행할 수 있도록 해주는 주요 메소드입니다
파라미터를 배열 형태로 받으며, 맨 처음 연산부터 순차적으로 파이프라인 연산을 수행합니다 ^^
db.collection.aggregation( [ { <stage1> }, { <stage2> }, { <stage3> }, ... ] )의 형태로 사용을 하고,
파라미터로 리스트 형태의 콜렉션 타입을 받으며,
배열의 elements로 각 스테이지를 기재해주시면 되겠습니다 ^^
1. 지정된 조건을 만족하는 문서만 필터링하기 : $match
샘플 코드를 통해 해당 조건으로 데이터를 조회했습니다 ^^
기본적으로 $match 단계는 지정된 조건을 만족하는 문서만을 필터링하여서
다음 파이프라인 단계로 전달하는 데 사용됩니다 ^^
형식은 { $match : { <query> } }의 구조입니다!
상기 캡쳐 이미지에서 aggregate() 메소드를 이용할 때
stage1에 해당하는 작업으로 $match를 지정했는데요
year 필드의 값이 1995인 도큐먼트들을 필터링하여 조회하였습니다 ^^
만약 그 이후의 파이프라인 작업이 필요하다면
이 $match 작업의 결과에 대해 다시 별도의 키워드를 지정해 연산을 해나가는 방식입니다!
2. 도큐먼트에 대해 그룹화 수행하기 : $group
$group 단계는 도큐먼트에 대한 그룹화를 수행하여
복잡한 집계 연산을 가능하게 합니다 ^^
$group 연산자는 그룹의 키를 정의하는 _id 필드를 필요로 합니다
_id는 표현식이 될 수 있으며, 그룹화의 기준이 되기 때문에 중요합니다 ^^!
그리고 각 그룹에 대해 집계 작업을 수행할 수 있는데요
이는 필드와 해당 필드에 적용할 누산식(accumulator)의 조합으로 사용됩니다 ^^
주요 누산식으로는 $sum, $avg, $min, $max, $count 등이 있는데요
이후 포스트에서 자세하게 알아보겠습니다 ^^
$group은 다음의 형식으로 사용됩니다
db.collection.aggregate([
{ $group: { _id: <expression>, // 그룹화할 필드를 지정
<field1>: { <accumulator1> : <expression1> }, // 그룹에 적용할 누산식
... }
}
])
샘플 코드와 출력 결과를 예시로 들어서 이해해보겠습니다 ^^
만약 모든 영화에 대해 댓글 수를 집계한다고 가정해보겠습니다
위와 같은 명령어 구졸르 사용할 수 있는데요
각 영화를 movie_id 필드를 기준으로 그룹화(_id : "$movie_id") 하고,
각 그룹에 대해 댓글 수를 누계($sum:1)하여 commentCount 필드에 저장하는 의미입니다 ^^
$sum:1은 그룹화된 문서의 갯수를 카운팅하는 것을 의미하는데요
그룹 내의 각 문서를 카운트하여 갯수를 계산합니다 ^^
$sum : "$runtime"과 같이 작성하면 runtime 컬럼의 값의 총합을 계산합니다 ^^
지금까지 명령어 구조를 살펴보면 어떤 것들은 키워드를 지정할 때
$사인이 붙는 것도 있고 해당 기호가 안 붙는 것들도 있는데요 ^^
이 부분이 많이 헷갈리는 부분이기 때문에 주의를 해주셔야 합니다 ^^;;
이번 포스트에서는 aggregate() 메소드를 사용해서
간단한 집계작업을 살펴보았습니다
$match와 $group 키워드를 조합해서 당연히 복수의 stage를 구성할 수 있습니다
$match를 이용해서 먼저 해당 조건으로 도큐먼트들을 필터링한 다음,
연산의 결과를 $group 스테이지의 입력으로 넣어서 그룹핑을 해주면서,
다음 포스트에서 살펴볼 주요 누산식(accumulator)을 적용하면,
단순히 find()만 사용해서 데이터를 조회하는 것보다 훨씬 복잡한 연산이 가능합니다 ^^
Aggregation에 관련된 내용을 전부 살펴보면
복잡한 명령구조도 쉽게 이해할 수 있게 되실거라 생각합니다!
포스트 읽어주셔서 감사드리고 다음 포스트로 찾아뵙겠습니다!