MongoDB에서 배열 안에 중첩된 특정 요소만 골라서 추출하고 싶다면 $elemMatch 프로젝션 연산자를 사용하면 됩니다. 이 연산자를 활용하면 문서 전체를 가져오지 않고도 조건에 맞는 배열 요소만 깔끔하게 조회할 수 있습니다.
1. 샘플 컬렉션 생성하기
먼저 예제로 사용할 컬렉션을 만들어 보겠습니다. insertOne() 메서드로 클라이언트 정보와 프로젝트 상세 데이터가 담긴 문서를 삽입합니다.
> db.extractSubArrayDemo.insertOne(
... {
... _id: 101,
... "clientName":"Larry",
... "ClientDetails":
... [
... {
... "ClientProjectName":"Online Game",
... "DeveloperTeamSize": 10
... },
... {
... "ClientProjectName":"Pig Dice Game",
... "DeveloperTeamSize": 12
... },
... {
... "ClientProjectName":"Web Student Tracker",
... "DeveloperTeamSize": 11
... }
... ]
... }
... );
{ "acknowledged" : true, "insertedId" : 101 }
2. 저장된 문서 확인하기
find() 메서드를 사용해 컬렉션의 모든 문서를 조회해 보겠습니다.
> db.extractSubArrayDemo.find().pretty();
실행하면 다음과 같은 출력 결과를 확인할 수 있습니다.
{
"_id" : 101,
"clientName" : "Larry",
"ClientDetails" : [
{
"ClientProjectName" : "Online Game",
"DeveloperTeamSize" : 10
},
{
"ClientProjectName" : "Pig Dice Game",
"DeveloperTeamSize" : 12
},
{
"ClientProjectName" : "Web Student Tracker",
"DeveloperTeamSize" : 11
}
]
}3. $elemMatch로 하위 배열 값 추출하기
이제 $elemMatch 연산자를 사용해 특정 조건에 맞는 배열 요소만 추출하는 쿼리를 작성해 보겠습니다. 아래 예제에서는 'Pig Dice Game'이라는 프로젝트 이름을 가진 요소만 조회하며, _id: 0 옵션으로 불필요한 _id 필드는 제외했습니다.
> db.extractSubArrayDemo.find({ '_id': 101 },{ _id: 0, ClientDetails:
{ $elemMatch: {ClientProjectName: 'Pig Dice Game' } }}).pretty();실행 결과는 다음과 같습니다.
{
"ClientDetails" : [
{
"ClientProjectName" : "Pig Dice Game",
"DeveloperTeamSize" : 12
}
]
}참고: 여러 개의 일치 요소를 추출하려면?
$elemMatch 프로젝션은 조건에 맞는 첫 번째 요소 하나만 반환한다는 점에 유의하세요. 조건을 만족하는 모든 배열 요소를 추출해야 한다면 집계 파이프라인(Aggregation Pipeline)의 $filter 연산자를 사용하는 것이 좋습니다.