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

MongoDB 컬렉션에서 배열 데이터 추출하는 방법 ($unwind·$group 활용)

MongoDB 컬렉션에서 배열 데이터 추출하는 방법

MongoDB에서 중첩된 배열 구조로 저장된 데이터를 하나의 배열로 깔끔하게 추출하고 싶다면 애그리게이션 프레임워크(aggregate framework)를 사용하는 것이 가장 효과적입니다. 이 글에서는 실제 예제를 통해 $unwind, $group, $push 연산자를 활용해 배열 데이터를 추출하는 과정을 단계별로 살펴보겠습니다.

1단계: 테스트용 컬렉션 생성

먼저 고객 정보와 친구 목록이 중첩 배열 형태로 담긴 문서를 삽입하여 컬렉션을 만들어 보겠습니다.

> db.getArrayDemo.insertOne(
    {
        "CustomerId":101,
        "CustomerDetails":[
           {
               "CustomerName":"Larry",
               "CustomerFriendDetails":[
                  {
                      "CustomerFriendName":"Sam"
                  },
                  {
                      "CustomerFriendName":"Robert"
                  }
               ]
           },
           {
               "CustomerName":"Chris",
               "CustomerFriendDetails":[
                  {
                      "CustomerFriendName":"David"
                  },
                  {
                      "CustomerFriendName":"Carol"
                  }
               ]
           }
        ]
    }
);
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cda4949b50a6c6dd317adb7")
}

2단계: 저장된 문서 확인하기

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

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

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

{
    "_id" : ObjectId("5cda4949b50a6c6dd317adb7"),
    "CustomerId" : 101,
    "CustomerDetails" : [
       {
           "CustomerName" : "Larry",
           "CustomerFriendDetails" : [
              {
                  "CustomerFriendName" : "Sam"
              },
              {
                  "CustomerFriendName" : "Robert"
              }
           ]
       },
       {
           "CustomerName" : "Chris",
           "CustomerFriendDetails" : [
              {
                  "CustomerFriendName" : "David"
              },
              {
                  "CustomerFriendName" : "Carol"
              }
           ]
       }
   ]
}

3단계: 애그리게이션으로 배열 추출하기

이제 핵심 단계입니다. 다음 쿼리는 MongoDB 컬렉션에 흩어져 있는 친구 이름들을 모아 하나의 배열로 추출합니다.

> db.getArrayDemo.aggregate([
    { "$unwind": "$CustomerDetails" },
    { "$unwind": "$CustomerDetails.CustomerFriendDetails"},
    {
       "$group": {
           "_id": null,
           "CustomerFriendDetails": { "$push": "$CustomerDetails.CustomerFriendDetails.CustomerFriendName" }
       }
    }
]);

위 파이프라인을 실행하면 다음과 같은 결과를 얻을 수 있습니다.

{ "_id" : null, "CustomerFriendDetails" : [ "Sam", "Robert", "David", "Carol" ] }

쿼리 동작 원리

  • $unwind: 배열 필드의 각 요소를 개별 문서로 분해합니다. 여기서는 최상위의 CustomerDetails 배열과 그 안에 중첩된 CustomerFriendDetails 배열을 차례로 펼쳤습니다.
  • $group: _id: null로 지정하면 분해된 모든 문서를 하나의 그룹으로 묶을 수 있습니다.
  • $push: 그룹화된 각 문서에서 친구 이름(CustomerFriendName) 값을 꺼내 하나의 배열에 순서대로 누적합니다.

정리하면, $unwind로 중첩 배열을 평탄화(flatten)한 뒤 $group$push로 재조합하는 방식입니다. 이 패턴을 응용하면 계층 구조 속에 흩어져 있던 값들을 조건에 따라 자유롭게 하나의 배열로 추출할 수 있습니다.