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

MongoDB에서 객체 배열 내 특정 중첩 문서를 쿼리하는 방법

MongoDB에서 배열 형태로 저장된 객체(중첩 문서) 중 특정 조건에 맞는 문서만 조회하고 싶다면 find() 메서드와 $elemMatch 연산자를 함께 사용하면 됩니다. 이 글에서는 예제 컬렉션을 만들고, 단계별로 원하는 중첩 문서만 추출하는 방법을 살펴보겠습니다.

1. 샘플 컬렉션 생성하기

먼저 학생 정보를 배열로 가지는 문서를 삽입하여 컬렉션을 생성합니다. 아래 예제에서 studentInformation 필드는 여러 개의 객체(학생 정보)를 담고 있는 배열입니다.

> db.demo763.insertOne(
...     {
...        _id: 1,
...        CountryName: "US",
...        "studentInformation": [
...           {
...              StudentName: "Chris"
...           },
...           {
...              StudentName: "David",
...              StudentAge: 22
...           }
...        ]
...     }
... );
{ "acknowledged" : true, "insertedId" : 1 }

위 문서에는 두 명의 학생이 저장되어 있습니다. Chris는 이름 정보만 있고, David는 이름과 나이(StudentAge) 정보를 모두 가지고 있습니다.

2. 컬렉션의 전체 문서 확인하기

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

> db.demo763.find();

실행 결과는 다음과 같습니다.

{ "_id" : 1, "CountryName" : "US", "studentInformation" : [ { "StudentName" : "Chris" }, { "StudentName" : "David", "StudentAge" : 22 } ] }

3. $elemMatch로 특정 중첩 문서만 조회하기

배열 안에서 특정 필드를 가진 객체만 골라내려면 두 번째 인자인 프로젝션(projection) 부분에 $elemMatch를 지정합니다. 아래 예제는 StudentAge 필드가 존재하는 학생 정보만 반환합니다.

> db.demo763.find({},
... {
...    studentInformation: {
...       $elemMatch: {
...          StudentAge: {
...             $exists: true
...          }
...       }
...    }
... })

실행 결과는 다음과 같습니다.

{ "_id" : 1, "studentInformation" : [ { "StudentName" : "David", "StudentAge" : 22 } ] }

결과 분석 및 핵심 정리

출력 결과를 보면 StudentName만 있는 Chris의 정보는 제외되고, StudentAge 필드를 가진 David의 정보만 반환된 것을 확인할 수 있습니다.

여기서 핵심은 다음과 같습니다.

- $elemMatch: 배열 내 요소 중 주어진 조건과 일치하는 첫 번째 요소만 프로젝션하여 반환합니다.
- $exists: true: 해당 필드가 실제로 존재하는 문서만 대상으로 합니다.

이처럼 find()의 프로젝션 단계에서 $elemMatch를 활용하면, 배열에 담긴 수많은 객체 중에서 필요한 중첩 문서만 정확하게 필터링할 수 있습니다. 참고로 조건에 일치하는 요소가 하나도 없으면 해당 배열 필드는 결과에서 생략됩니다.