MongoDB에서 집계 함수(aggregate)는 여러 단계의 파이프라인을 거쳐 데이터를 그룹화하거나 요약할 때 매우 유용합니다. 이번 글에서는 실제 예제를 통해 컬렉션 생성부터 집계 쿼리 작성까지 전 과정을 살펴보겠습니다.
1. 컬렉션 생성 및 문서 삽입
먼저 insertOne() 메서드를 사용해 문서가 포함된 컬렉션을 생성합니다. 아래 예제에서는 과목별 점수 정보를 배열 형태로 담은 문서 하나를 삽입합니다.
> db.demo121.insertOne(
... {
... "Id" : 101,
... "Details" : [
... {
... "SubjectId" : "1",
... "SubjectName" : "MongoDB",
... "Score" : 76
... },
... {
... "SubjectId" : "2",
... "SubjectName" : "MySQL",
... "Score" : 76
... },
... {
... "SubjectId" : "3",
... "SubjectName" : "Java",
... "Score" : 76
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e2f1c60140daf4c2a3544b3")
}2. find() 메서드로 문서 조회하기
삽입된 문서가 정상적으로 저장되었는지 확인하려면 find() 메서드를 사용해 컬렉션의 모든 문서를 조회할 수 있습니다.
> db.demo121.find();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5e2f1c60140daf4c2a3544b3"), "Id" : 101, "Details" : [
{ "SubjectId" : "1", "SubjectName" : "MongoDB", "Score" : 76 },
{ "SubjectId" : "2", "SubjectName" : "MySQL", "Score" : 76 },
{ "SubjectId" : "3", "SubjectName" : "Java", "Score" : 76 }
]
}3. 집계 함수(Aggregate) 쿼리 구현하기
이제 본격적으로 집계 파이프라인을 구현해 보겠습니다. 아래 쿼리는 $match, $unwind, $group 세 가지 주요 연산자를 활용합니다.
- $match: 조건에 맞는 문서만 필터링합니다. 여기서는 Id가 101인 문서만 통과시킵니다.
- $unwind: Details 배열의 각 요소를 개별 문서로 분해하여 처리하기 쉽게 만듭니다.
- $group: SubjectId 기준으로 문서를 그룹화하고,
$sum으로 개수를 세며$push로 과목명을 배열에 담습니다.
> db.demo121.aggregate([
... { "$match": { "Id": 101 } },
... { "$unwind": "$Details" },
... {
... "$group": {
... "_id": "$Details.SubjectId",
... "count": { "$sum": 1 },
... "Details": {
... "$push": {
... "SubjectName": "$Details.SubjectName"
... }
... }
... }
... },
... {
... "$group": {
... "_id": null,
... "List": {
... "$push": {
... "SubId": "$_id",
... "Details": "$Details"
... }
... }
... }
... }
... ], function (err, out) {
... res.json(out);
... });4. 실행 결과 확인
위 집계 쿼리를 실행하면 각 과목 ID별로 과목명이 정리된 최종 결과를 얻을 수 있습니다.
{
"_id" : null, "List" : [
{ "SubId" : "3", "Details" : [ { "SubjectName" : "Java" } ] },
{ "SubId" : "2", "Details" : [ { "SubjectName" : "MySQL" } ] },
{ "SubId" : "1", "Details" : [ { "SubjectName" : "MongoDB" } ] }
]
}정리
MongoDB의 집계 파이프라인은 $match로 데이터를 필터링하고, $unwind로 배열을 분해한 뒤, $group으로 원하는 형태로 재구성하는 흐름으로 동작합니다. 특히 중첩된 배열 데이터를 다룰 때는 두 번의 $group 단계를 활용하면 위 예제처럼 깔끔하게 데이터를 재구조화할 수 있습니다. Node.js 환경에서는 마지막 콜백 함수에서 res.json(out)을 호출해 결과를 클라이언트에 응답으로 전달할 수 있습니다.