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

MongoDB에서 중첩 문서 집계하는 방법 – aggregate()와 $sum 활용 예제

MongoDB에서 집계(Aggregation) 작업을 수행하려면 aggregate() 메서드를 사용합니다. 이 글에서는 여러 단계로 깊이 중첩된 문서 안의 특정 필드 값들을 합산하는 방법을 단계별로 살펴보겠습니다.

1. 샘플 컬렉션 및 문서 생성

먼저 insertOne() 메서드를 사용하여 중첩 구조를 가진 문서 두 개를 컬렉션에 삽입합니다.

> db.demo199.insertOne(
...   {
...      "details1":{
...         "details2":{
...            "details3":{
...               "Name":"Chris",
...               "details4":{
...                  "details5":{
...                     "v1":10,
...                     "v2":20,
...                     "v3":30
...                  }
...               }
...      }}}}
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e3c24aa03d395bdc21346e2")
}
>
> db.demo199.insertOne(
...   {
...      "details1":{
...         "details2":{
...            "details3":{
...               "Name":"Chris",
...               "details4":{
...                  "details5":{
...                     "v1":30,
...                     "v2":40,
...                     "v3":50
...                  }
...               }
...   }}}}
...);
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e3c24ab03d395bdc21346e3")
}

2. 저장된 문서 확인하기

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

> db.demo199.find();

위 명령은 다음과 같은 결과를 출력합니다.

{ "_id" : ObjectId("5e3c24aa03d395bdc21346e2"), "details1" : { "details2" : { "details3" : { "Name" : "Chris", "details4" : { "details5" : { "v1" : 10, "v2" : 20, "v3" : 30 } } } } } }
{ "_id" : ObjectId("5e3c24ab03d395bdc21346e3"), "details1" : { "details2" : { "details3" : { "Name" : "Chris", "details4" : { "details5" : { "v1" : 30, "v2" : 40, "v3" : 50 } } } } } }

3. 중첩 문서 집계 쿼리 작성하기

다음은 중첩된 문서 구조에서 v1, v2, v3 값의 합계를 구하는 집계 쿼리입니다. $unwind 단계로 필드를 순회 처리한 뒤, $group으로 그룹화하고 $sum 연산자로 각 필드의 합계를 계산합니다. 이때 점 표기법(dot notation)을 사용하면 몇 단계든 깊게 중첩된 필드에도 바로 접근할 수 있습니다.

> var out = [
...   {
...      "$unwind": "$details1.details2"
...   },
...   {
...      "$group": {
...         "_id": "$details1.details2._id",
...         "v1": { "$sum": "$details1.details2.details3.details4.details5.v1" },
...         "v2": { "$sum": "$details1.details2.details3.details4.details5.v2" },
...         "v3": { "$sum": "$details1.details2.details3.details4.details5.v3" },
...      }
...   }
...]
> result = db.demo199.aggregate(out);

집계 결과는 다음과 같습니다.

{ "_id" : null, "v1" : 40, "v2" : 60, "v3" : 80 }

결과를 보면 두 문서에 걸쳐 v1은 10 + 30 = 40, v2는 20 + 40 = 60, v3는 30 + 50 = 80으로 각각 정확히 합산되었습니다. 이처럼 $group$sum을 조합하면 아무리 복잡하게 중첩된 문서 구조라도 원하는 필드의 값을 손쉽게 집계할 수 있습니다.