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

MongoDB에서 배열 내 평점 평균을 계산하고 원본 문서에 새 필드로 추가하는 방법

MongoDB에서는 $avg 연산자애그리게이션(aggregate) 프레임워크와 함께 사용하여 배열에 저장된 값들의 평균을 손쉽게 계산할 수 있습니다. 특히 $addFields 스테이지를 조합하면 계산된 평균값을 기존 문서에 새로운 필드로 추가할 수 있어 매우 유용합니다.

이 글에서는 학생 점수(StudentScore) 배열의 평균을 구하고, 그 결과를 원본 문서에 포함시키는 과정을 단계별로 살펴보겠습니다.

1단계: 샘플 컬렉션 생성하기

먼저 insertOne() 메서드를 사용하여 학생 정보 배열이 담긴 문서를 생성합니다.

> db.averageOfRatingsInArrayDemo.insertOne(
...   {
...      "StudentDetails":[
...         {
...            "StudentId":1,
...            "StudentScore":45
...         },
...         {
...            "StudentId":2,
...            "StudentScore":58
...         },
...         {
...            "StudentId":3,
...            "StudentScore":67
...         }
...      ]
...   }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd427dc2cba06f46efe9ee4")
}

2단계: 전체 문서 조회하기

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

> db.averageOfRatingsInArrayDemo.find().pretty();

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

{
    "_id" : ObjectId("5cd427dc2cba06f46efe9ee4"),
    "StudentDetails" : [
        {
            "StudentId" : 1,
            "StudentScore" : 45
        },
        {
            "StudentId" : 2,
            "StudentScore" : 58
        },
        {
            "StudentId" : 3,
            "StudentScore" : 67
        }
    ]
}

3단계: $addFields와 $avg로 평균 계산 후 필드 추가하기

이제 aggregate() 파이프라인 안에서 $addFields 스테이지와 $avg 연산자를 함께 사용하여 배열 내 점수의 평균을 계산하고, 그 결과를 원본 문서에 새로운 필드로 추가해 보겠습니다.

> db.averageOfRatingsInArrayDemo.aggregate([ {$addFields : {StudentScoreAverage : {$avg : "$StudentDetails.StudentScore"}}} ]);

실행 결과는 다음과 같습니다. 기존 문서 뒤에 StudentScoreAverage라는 새로운 필드가 추가되고, 세 학생 점수(45, 58, 67)의 평균값이 자동으로 계산되어 저장된 것을 확인할 수 있습니다.

{ "_id" : ObjectId("5cd427dc2cba06f46efe9ee4"), "StudentDetails" : [ { "StudentId" : 1, "StudentScore" : 45 }, { "StudentId" : 2, "StudentScore" : 58 }, { "StudentId" : 3, "StudentScore" : 67 } ], "StudentScoreAverage" : 56.666666666666664 }

정리

이처럼 MongoDB의 애그리게이션 프레임워크에서 $addFields$avg를 조합하면, 배열 요소들의 평균값을 계산하면서 동시에 원본 문서 구조를 그대로 유지한 채 결과 필드를 추가할 수 있습니다. 별도의 업데이트 작업 없이 조회 시점에 계산된 값을 함께 확인해야 하는 경우에 특히 유용한 패턴입니다.