MongoDB 배열 내에서 조건에 맞는 문서 찾기
MongoDB에서 배열 필드 안에 포함된 하위 문서(sub-document) 중 특정 조건과 일치하는 요소를 검색하려면 $elemMatch 연산자를 사용하면 됩니다. $elemMatch는 배열 내 각 요소가 지정한 모든 쿼리 조건을 동시에 만족하는지 확인할 때 유용합니다.
이번 글에서는 실제 예제를 통해 $elemMatch의 사용법을 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성
먼저 테스트용 컬렉션을 만들고 문서를 삽입합니다. 아래 예제에서는 사용자 정보를 배열 형태로 담은 문서 두 개를 생성했습니다.
> db.getMatchingDocumentDemo.insertOne(
{
_id : 1,
"UserDetails" : [
{
"UserName" : "John",
"UserAge" : 23
}
]
}
);
{ "acknowledged" : true, "insertedId" : 1 }
> db.getMatchingDocumentDemo.insertOne(
{ _id : 2, "UserDetails" : [ { "UserName" : "Larry", "UserAge" : 24 } ] }
);
{ "acknowledged" : true, "insertedId" : 2 }두 개의 문서가 성공적으로 삽입되었습니다.
2. 전체 문서 확인하기
find() 메서드를 사용해 컬렉션에 저장된 모든 문서를 조회해 보겠습니다.
> db.getMatchingDocumentDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : 1,
"UserDetails" : [
{
"UserName" : "John",
"UserAge" : 23
}
]
}
{
"_id" : 2,
"UserDetails" : [
{
"UserName" : "Larry",
"UserAge" : 24
}
]
}3. $elemMatch로 배열 내 일치하는 문서 조회
이제 본격적으로 $elemMatch 연산자를 사용해 배열 내부에서 조건에 맞는 문서를 조회해 보겠습니다. 여기서는 UserAge가 24인 사용자를 찾는 쿼리입니다.
> db.getMatchingDocumentDemo.find({ UserDetails: { $elemMatch: { UserAge: 24 } } });실행 결과는 다음과 같습니다.
{ "_id" : 2, "UserDetails" : [ { "UserName" : "Larry", "UserAge" : 24 } ] }정리
$elemMatch를 사용하면 배열 안의 여러 필드 조건을 하나의 요소에 대해 동시에 검사할 수 있습니다. 예를 들어 UserName과 UserAge처럼 서로 다른 조건을 조합할 때도 일반 쿼리와 달리 같은 배열 요소 내에서만 매칭되도록 보장해 주므로, 정확한 문서 검색에 매우 유용합니다.