MongoDB에서 배열 내부의 특정 하위 요소(sub-element)만 조회하고 싶다면 위치 연산자(positional operator) $를 사용할 수 있습니다. 위치 연산자는 쿼리 조건에 일치하는 배열 요소만 프로젝션 결과에 포함시켜 주는 강력한 기능입니다.
1. 테스트용 컬렉션 생성하기
먼저 예제로 사용할 컬렉션을 만들고 문서를 삽입해 보겠습니다.
> db.subElementQueryingDemo.insertOne(
... {
... "ClientName":"Chris",
... "Status": [ { "isMarried": true }, { "isMarried": false } ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5ccf28c9dceb9a92e6aa1953")
}위 문서는 클라이언트 이름과 함께 Status라는 배열 필드를 가지며, 배열 안에는 각각 isMarried 값을 담은 두 개의 객체가 들어 있습니다.
2. find() 메서드로 전체 문서 확인하기
find() 메서드를 사용해 컬렉션의 모든 문서를 출력해 보겠습니다.
> db.subElementQueryingDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5ccf28c9dceb9a92e6aa1953"),
"ClientName" : "Chris",
"Status" : [
{
"isMarried" : true
},
{
"isMarried" : false
}
]
}현재 Status 배열에는 isMarried: true와 isMarried: false 두 개의 요소가 모두 포함되어 있습니다.
3. 위치 연산자 $로 하위 요소 쿼리하기
이제 위치 연산자 $를 활용해 조건에 맞는 배열 요소만 조회해 보겠습니다.
> db.subElementQueryingDemo.find({ "Status.isMarried": true }, {ClientName: 1, 'Status.$': 1}).pretty();쿼리 구조를 살펴보면 다음과 같습니다.
- 첫 번째 인수(쿼리 조건):
{ "Status.isMarried": true }– 배열 내에서isMarried가true인 요소를 찾습니다. - 두 번째 인수(프로젝션):
{ ClientName: 1, 'Status.$': 1 }–ClientName필드와, 조건에 일치하는 첫 번째 배열 요소(Status.$)만 반환합니다.
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5ccf28c9dceb9a92e6aa1953"),
"ClientName" : "Chris",
"Status" : [
{
"isMarried" : true
}
]
}핵심 정리
이처럼 MongoDB에서는 점 표기법(dot notation)으로 배열 내부의 하위 필드에 접근해 조건을 지정하고, 프로젝션 단계에서 위치 연산자 $를 사용하면 일치하는 배열 요소만 깔끔하게 추출할 수 있습니다. 전체 배열이 아닌 필요한 요소만 가져오고 싶을 때 매우 유용한 패턴이므로 꼭 기억해 두시기 바랍니다.