MongoDB에서 배열 필드 내부의 요소 조건을 기준으로 문서를 조회하려면 $elemMatch 연산자를 사용해야 합니다. $elemMatch는 하나의 배열 요소 안에서 여러 조건이 동시에 만족되는지를 검사할 때 특히 유용합니다.
1. 샘플 컬렉션 생성
먼저 예제에 사용할 컬렉션을 만들고 문서를 삽입하겠습니다. 아래 예시는 details라는 배열 필드를 가진 두 개의 문서를 생성하는 코드입니다.
> db.demo592.insertOne(
... {
... "id":101,
... "details" : [
... { "Name" : "Chris", "Value" : "200"},
... {"Name" : "David", "Value" : "800"}
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e930d8ffd2d90c177b5bcd6")
}
> db.demo592.insertOne(
... {
... id:102,
... "details" : [
... { "Name" : "Chris", "Value" : "500"},
... {"Name" : "David", "Value" : "900"}
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e930d90fd2d90c177b5bcd7")
}2. 전체 문서 조회하기
find() 메서드를 사용하면 컬렉션의 모든 문서를 확인할 수 있습니다.
> db.demo592.find();
위 명령을 실행하면 다음과 같은 출력 결과가 나타납니다.
{ "_id" : ObjectId("5e930d8ffd2d90c177b5bcd6"), "id" : 101, "details" : [
{ "Name" : "Chris", "Value" : "200" },
{ "Name" : "David", "Value" : "800" }
] }
{ "_id" : ObjectId("5e930d90fd2d90c177b5bcd7"), "id" : 102, "details" : [
{ "Name" : "Chris", "Value" : "500" },
{ "Name" : "David", "Value" : "900" }
] }3. $elemMatch를 이용한 조건 매칭 쿼리
이제 배열 필드의 각 요소가 특정 조건을 충족하는지 확인하는 쿼리를 작성해 보겠습니다. 아래 예제는 $and 연산자와 함께 두 개의 $elemMatch 조건을 결합하여, 'Chris'의 Value가 500 이상이고 동시에 'David'의 Value가 600 이상인 문서를 찾습니다.
> db.demo592.find(
... {
... "$and" : [
... { "details" : { "$elemMatch" : { "Name" : "Chris", "Value" : { "$gte" : "500" } } } },
... { "details" : { "$elemMatch" : { "Name" : "David", "Value" : { "$gte" : "600" } } } }
... ]
... }
... );위 쿼리를 실행하면 조건을 모두 충족하는 문서만 반환됩니다.
{ "_id" : ObjectId("5e930d90fd2d90c177b5bcd7"), "id" : 102, "details" : [
{ "Name" : "Chris", "Value" : "500" }, { "Name" : "David", "Value" : "900" }
] }정리
첫 번째 문서(id: 101)는 Chris의 Value가 200으로 조건(500 이상)을 만족하지 못했기 때문에 결과에서 제외되었습니다. 반면 두 번째 문서(id: 102)는 Chris(Value: 500)와 David(Value: 900) 모두 조건을 충족하므로 정상적으로 조회되었습니다.
이처럼 $elemMatch를 사용하면 배열 내부의 개별 요소 단위로 복합 조건을 정확하게 검사할 수 있어, 중첩된 데이터 구조를 다루는 MongoDB 쿼리 작성 시 매우 효과적입니다.