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로 재조합하는 방식입니다. 이 패턴을 응용하면 계층 구조 속에 흩어져 있던 값들을 조건에 따라 자유롭게 하나의 배열로 추출할 수 있습니다.