MongoDB에서 배열 필드에 포함된 객체 중 일부 속성만 선택적으로 조회하고 싶은 경우가 자주 있습니다. 이 글에서는 프로젝션(projection) 기능을 활용해 배열 내부의 특정 필드만 추출하는 방법을 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성
먼저 고객 정보를 담고 있는 문서를 하나 삽입하여 테스트용 컬렉션을 만들어 보겠습니다. insertOne() 메서드를 사용하면 됩니다.
> db.projectionAnElementDemo.insertOne(
... {
... "CustomerId": 100,
... "CustomerDetails": [
... {
... "CustomerName": "Chris",
... "CustomerCountryName": "US"
... },
... {
... "CustomerName": "Robert",
... "CustomerCountryName": "UK"
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd31c56b64f4b851c3a13ea")
}위 문서는 CustomerId와 함께 CustomerDetails라는 배열 필드를 가지며, 각 배열 요소는 고객 이름(CustomerName)과 국가명(CustomerCountryName)으로 구성되어 있습니다.
2. 전체 문서 조회하기
find() 메서드와 pretty()를 조합하면 컬렉션의 모든 문서를 보기 좋게 출력할 수 있습니다.
> db.projectionAnElementDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5cd31c56b64f4b851c3a13ea"),
"CustomerId" : 100,
"CustomerDetails" : [
{
"CustomerName" : "Chris",
"CustomerCountryName" : "US"
},
{
"CustomerName" : "Robert",
"CustomerCountryName" : "UK"
}
]
}3. 배열 내부의 특정 필드만 프로젝션하기
이제 핵심 부분입니다. 두 번째 인자인 프로젝션 객체에 점 표기법(dot notation)을 사용하여 "CustomerDetails.CustomerName": 1처럼 지정하면, 배열 안의 각 객체에서 원하는 필드만 골라서 반환받을 수 있습니다.
> db.projectionAnElementDemo.find(
{},
{ CustomerId: 1, "CustomerDetails.CustomerName": 1 }
).pretty();결과를 확인해 보면 CustomerCountryName은 제외되고 고객 이름만 출력된 것을 볼 수 있습니다.
{
"_id" : ObjectId("5cd31c56b64f4b851c3a13ea"),
"CustomerId" : 100,
"CustomerDetails" : [
{
"CustomerName" : "Chris"
},
{
"CustomerName" : "Robert"
}
]
}정리
MongoDB의 프로젝션은 최상위 필드뿐 아니라 중첩된 배열 요소 내부의 필드에도 적용할 수 있습니다. 점 표기법으로 "배열필드.하위필드": 1 형태로 지정하기만 하면 되며, 이를 통해 불필요한 데이터 전송량을 줄이고 애플리케이션 성능을 개선할 수 있습니다. 참고로 더 세밀한 배열 요소 필터링이 필요하다면 MongoDB 3.2부터 지원하는 $project 애그리게이션 연산자나 $elemMatch, $slice 등의 옵션도 함께 검토해 보시기 바랍니다.