MongoDB 다차원 배열 투영이란?
MongoDB에서 다차원(중첩) 배열을 투영(projection)하려면 일반적인 find() 쿼리만으로는 부족하며, 애그리게이션 프레임워크(aggregate framework)를 사용해야 합니다. 이 글에서는 학생 점수 데이터를 예제로 삼아, 중첩 배열 안의 특정 요소만 추출하는 방법을 단계별로 살펴보겠습니다.
1단계: 샘플 컬렉션 생성
먼저 다차원 배열을 포함한 문서를 저장할 컬렉션을 생성합니다. 아래 예제에서는 학생 이름과 2차원 배열 형태의 점수(StudentMarks)를 함께 저장합니다.
> db.multiDimensionalArrayProjection.insertOne(
... {
... "StudentFirstName" : "Chris",
... "StudentMarks" : [ [98, 99],[56,79] ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5cc6b75a9cb58ca2b005e66c")
}2단계: 저장된 문서 확인
find() 메서드를 사용해 컬렉션에 저장된 모든 문서를 조회해 보겠습니다.
> db.multiDimensionalArrayProjection.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5cc6b75a9cb58ca2b005e66c"),
"StudentFirstName" : "Chris",
"StudentMarks" : [
[
98,
99
],
[
56,
79
]
]
}3단계: aggregate로 다차원 배열 투영하기
이제 본격적으로 다차원 배열을 투영하는 쿼리를 살펴보겠습니다. 핵심은 $unwind를 두 번 사용해 바깥 배열과 안쪽 배열을 차례로 분해한 뒤, $skip과 $limit으로 원하는 위치의 요소만 남기는 것입니다.
> db.multiDimensionalArrayProjection.aggregate([
... { $unwind: '$StudentMarks' },
... { $limit: 1 },
... { $project: { _id: 0, StudentMarks: 1 } },
... { $unwind: '$StudentMarks' },
... { $skip: 1 },
... { $limit: 1 }
... ]);위 파이프라인을 실행하면 다음과 같은 결과가 반환됩니다.
{ "StudentMarks" : 99 }쿼리 동작 원리 살펴보기
각 스테이지가 어떤 역할을 하는지 정리하면 다음과 같습니다.
- $unwind (첫 번째): 바깥쪽 배열 [ [98, 99], [56, 79] ]를 개별 문서 [98, 99]와 [56, 79]로 분해합니다.
- $limit: 1: 분해된 문서 중 첫 번째 배열 [98, 99]만 남깁니다.
- $project: _id 필드를 제외하고 StudentMarks 필드만 출력하도록 지정합니다.
- $unwind (두 번째): 남은 내부 배열 [98, 99]를 다시 개별 값 98과 99로 분해합니다.
- $skip: 1: 첫 번째 값(98)을 건너뜁니다.
- $limit: 1: 최종적으로 두 번째 값인 99만 결과로 반환합니다.
이처럼 aggregate 파이프라인의 각 스테이지를 조합하면, 다차원 배열의 특정 위치에 있는 요소를 손쉽게 추출할 수 있습니다. 인덱스 위치를 변경하고 싶다면 $skip과 $limit의 값을 조정하면 됩니다.