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

MongoDB 다차원 배열 투영 방법 – aggregate로 중첩 배열 요소 추출하기

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의 값을 조정하면 됩니다.