MongoDB 컬렉션의 객체 배열 안에서 특정 조건에 일치하는 요소만 골라서 조회하고 싶다면 프로젝션(projection) 연산자인 $elemMatch를 사용하면 됩니다. 이 글에서는 객체 배열이 포함된 문서를 먼저 생성한 뒤, 배열 내 조건에 부합하는 요소만 추출하는 방법을 단계별로 살펴보겠습니다.
1. 테스트용 컬렉션 생성
먼저 객체 배열(Persons)을 포함한 문서를 컬렉션에 삽입합니다. 아래 쿼리를 실행해 보세요.
> db.objectArray.insert({"Persons":[
{"PersonName":"Adam","PersonSalary":25000},{"PersonName":"Larry","PersonSalary":27000
}]});
WriteResult({ "nInserted" : 1 })
> db.objectArray.insert({"Persons":[
{"PersonName":"David","PersonSalary":32000},{"PersonName":"Carol","PersonSalary":77000
}]});
WriteResult({ "nInserted" : 1 })2. 전체 문서 조회하기
find() 메서드를 사용해 삽입된 모든 문서를 확인할 수 있습니다.
> db.objectArray.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c6bfadc68174aae23f5ef53"),
"Persons" : [
{
"PersonName" : "Adam",
"PersonSalary" : 25000
},
{
"PersonName" : "Larry",
"PersonSalary" : 27000
}
]
}
{
"_id" : ObjectId("5c6bfb0968174aae23f5ef54"),
"Persons" : [
{
"PersonName" : "David",
"PersonSalary" : 32000
},
{
"PersonName" : "Carol",
"PersonSalary" : 77000
}
]
}3. $elemMatch로 조건에 맞는 요소만 검색하기
이제 객체 배열에서 조건에 일치하는 요소만 반환하는 쿼리를 살펴보겠습니다. 여기서 _id:0은 결과에서 _id 필드를 제외(숨김)하기 위해 추가한 옵션입니다.
> db.objectArray.find({"Persons.PersonSalary":25000}, {
_id:0,Persons:{$elemMatch:{"PersonSalary":25000}}}).pretty();실행 결과, PersonSalary가 25000인 요소만 정확히 반환됩니다.
{
"Persons" : [
{
"PersonName" : "Adam",
"PersonSalary" : 25000
}
]
}4. 대체 방법: 위치 연산자($) 사용하기
같은 작업은 프로젝션 연산자인 위치 연산자($)를 통해서도 수행할 수 있습니다. 쿼리 조건과 일치하는 첫 번째 배열 요소만 반환한다는 점이 특징입니다.
> db.objectArray.find({"Persons.PersonSalary":25000}, { _id:0,'Persons.$':1}).pretty();실행 결과는 앞선 방법과 동일하게 나타납니다.
{
"Persons" : [
{
"PersonName" : "Adam",
"PersonSalary" : 25000
}
]
}정리
MongoDB에서 객체 배열 내부의 특정 요소만 조회할 때는 두 가지 방법을 활용할 수 있습니다. 조건을 명확하게 지정하려면 $elemMatch, 쿼리 조건과 일치하는 첫 번째 요소만 간단히 가져오려면 위치 연산자($)를 사용하는 것이 좋습니다. 상황에 맞게 선택하여 원하는 데이터만 효율적으로 추출해 보세요.