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

MongoDB 집계(Aggregation)로 문서 및 배열 요소의 평균값 구하기

MongoDB에서 문서 필드와 배열 내부 요소의 평균값을 한 번에 계산해야 하는 경우가 있습니다. 이럴 때는 $avg 연산자를 $group 단계와 함께 aggregate() 메서드 안에서 사용하면 됩니다.

1. 샘플 컬렉션 생성하기

먼저 실습용 컬렉션을 만들고 문서를 삽입하겠습니다. 각 문서는 학생 정보와 이름·점수를 담은 details 배열을 포함하고 있습니다.

> db.demo598.insertOne(
...     {
...        Information:'Student',
...        id:100,
...        details:[
...           {Name:'Chris',Marks:75},
...           {Name:'Bob',Marks:55}
...        ]
...    }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e947fccf5f1e70e134e2694")
}
> db.demo598.insertOne(
...     {
...        Information:'Student',
...        id:101,
...        details:[
...           {Name:'Chris',Marks:75},
...           {Name:'Bob',Marks:45}
...        ]
...    }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e947fcdf5f1e70e134e2695")
}

2. 저장된 문서 확인하기

find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.

> db.demo598.find();

위 명령을 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.

{ "_id" : ObjectId("5e947fccf5f1e70e134e2694"), "Information" : "Student", "id" : 100, "details" : [
    { "Name" : "Chris", "Marks" : 75 },
    { "Name" : "Bob", "Marks" : 55 }
] }
{ "_id" : ObjectId("5e947fcdf5f1e70e134e2695"), "Information" : "Student", "id" : 101, "details" : [
    { "Name" : "Chris", "Marks" : 75 },
    { "Name" : "Bob", "Marks" : 45 }
] }

3. 집계 파이프라인으로 평균값 계산하기

이제 문서의 id 필드 평균과 배열 요소별 점수(Marks) 평균을 동시에 구하는 쿼리입니다. 핵심 흐름은 다음과 같습니다.

  • $group: Information 기준으로 그룹화하고 id 평균과 details 배열을 모읍니다.
  • $unwind: 중첩된 details 배열을 개별 문서로 펼칩니다(두 번 적용).
  • $group: 이름(Name)별로 다시 그룹화하여 점수 평균($avg)을 계산합니다.
  • $sort: 결과를 정렬한 뒤 최종 형태로 재구성합니다.
> db.demo598.aggregate([
...
...     { "$group": {
...        "_id": "Information",
...        "id": { "$avg": "$id" },
...        "details": { "$push": "$details" }
...     }},
...     { "$unwind": "$details" },
...     { "$unwind": "$details" },
...     { "$group": {
...        "_id": { "Information": "$_id", "Name": "$details.Name" },
...        "id": { "$avg": "$id" },
...        "AvgValue": { "$avg": "$details.Marks" }
...     }},
...     { "$sort": { "_id": 1 } },
...     { "$group": {
...        "_id": "$_id.Information",
...        "id": { "$avg": "$id" },
...        "details": { "$push": {
...            "Name": "$_id.Name",
...            "MarksAvg": "$AvgValue"
...        }}
...     }}
... ]).pretty();

4. 실행 결과

위 집계 쿼리를 실행하면 다음과 같은 출력 결과가 나타납니다.

{
    "_id" : "Information",
    "id" : 100.5,
    "details" : [
        {
            "Name" : "Bob",
            "MarksAvg" : 50
        },
        {
            "Name" : "Chris",
            "MarksAvg" : 75
        }
    ]
}

결과를 살펴보면 id 필드의 평균은 100.5((100 + 101) / 2)로 계산되었고, Bob의 점수 평균은 50((55 + 45) / 2), Chris의 점수 평균은 75((75 + 75) / 2)로 정확하게 산출된 것을 확인할 수 있습니다.

이처럼 MongoDB의 집계 프레임워크를 활용하면 문서 수준의 값과 배열 내부 요소의 값을 함께 그룹화하여 손쉽게 통계를 낼 수 있습니다.