Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB 집계 함수(Aggregate)를 활용한 쿼리 작성 방법

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)을 호출해 결과를 클라이언트에 응답으로 전달할 수 있습니다.