MongoDB에서 특정 하위 문서 선택하기
MongoDB에서 배열 안에 포함된 특정 하위 문서(subdocument)만 조회하고 싶다면 find() 메서드에 조건과 프로젝션을 함께 사용하면 됩니다. 이 글에서는 예제를 통해 단계별로 살펴보겠습니다.
1단계: 컬렉션 생성 및 문서 삽입
먼저 insertOne() 메서드를 사용해 데모용 컬렉션에 문서를 생성합니다.
> db.demo37.insertOne({"Details":[{"Name":"Chris","Age":21},{"Name":"David","Age":23}]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e176635cfb11e5c34d898d7")
}
> db.demo37.insertOne({"Details":[{"Name":"Sam","Age":23},{"Name":"Robert","Age":25}]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e17664acfb11e5c34d898d8")
}2단계: 전체 문서 확인하기
find() 메서드를 사용해 컬렉션의 모든 문서를 출력해 보겠습니다.
> db.demo37.find();
위 쿼리는 다음과 같은 결과를 반환합니다.
{ "_id" : ObjectId("5e176635cfb11e5c34d898d7"), "Details" : [ { "Name" : "Chris", "Age" : 21 }, { "Name" : "David", "Age" : 23 } ] }
{ "_id" : ObjectId("5e17664acfb11e5c34d898d8"), "Details" : [ { "Name" : "Sam", "Age" : 23 }, { "Name" : "Robert", "Age" : 25 } ] }3단계: 특정 하위 문서만 조회하는 쿼리
이제 이름이 'Sam'인 하위 문서만 선택해 보겠습니다. 쿼리 조건에는 'Details.Name' 필드 경로를 사용하고, 프로젝션 부분에는 위치 연산자($)를 활용해 일치하는 배열 요소만 반환받습니다.
> db.demo37.find({'Details.Name' : 'Sam'},{_id: 0, 'Details.$.Name': 1});실행 결과는 다음과 같습니다.
{ "Details" : [ { "Name" : "Sam", "Age" : 23 } ] }핵심 정리
배열 내 하위 문서를 조회할 때는 다음 두 가지가 핵심입니다.
- 쿼리 조건: 점 표기법(dot notation)으로 '필드명.하위필드명' 형태로 조건을 지정합니다.
- 프로젝션: 위치 연산자($)를 사용하면 조건에 일치하는 첫 번째 배열 요소만 반환되며, _id: 0으로 _id 필드를 제외할 수 있습니다.