MongoDB에서 배열 내 객체의 필드 값으로 문서 조회하기
네, 가능합니다. MongoDB에서 배열 안에 포함된 객체의 특정 필드가 지정한 값과 일치하는 문서를 조회하려면 $elemMatch 연산자를 사용하면 됩니다.
$elemMatch는 배열 내 요소 중 하나라도 주어진 조건을 모두 만족하는 경우 해당 문서를 반환합니다. 기본적인 사용 문법은 다음과 같습니다.
db.yourCollectionName.find({"yourOuterFieldName": { $elemMatch: { "yourInnerFieldName": "yourValue" } } } ).pretty();예제용 컬렉션 생성하기
개념을 이해하기 위해 먼저 문서가 포함된 컬렉션을 생성해 보겠습니다. 아래 쿼리를 사용하면 컬렉션에 문서를 삽입할 수 있습니다.
> db.objectInAnArrayDemo.insertOne({ "StudentDetails": [{
"StudentName": "John", "StudentMessage": "Hi"}, {"StudentName": "Larry", "StudentMessage": "Hello"}]})
{
"acknowledged" : true,
"insertedId" : ObjectId("5c92635d36de59bd9de06381")
}
> db.objectInAnArrayDemo.insertOne({ "StudentDetails": [{
"StudentName": "Carol", "StudentMessage": "Hello"}, {"StudentName": "David", "StudentMessage": "Good Morning"}]})
{
"acknowledged" : true,
"insertedId" : ObjectId("5c92637936de59bd9de06382")
}위 예제에서는 각 문서가 StudentDetails라는 배열 필드를 가지고 있으며, 배열의 각 요소는 학생 이름(StudentName)과 메시지(StudentMessage)를 담고 있는 객체입니다.
저장된 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다. pretty()를 함께 사용하면 결과를 보기 좋게 정렬하여 출력해 줍니다.
> db.objectInAnArrayDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c92635d36de59bd9de06381"),
"StudentDetails" : [
{
"StudentName" : "John",
"StudentMessage" : "Hi"
},
{
"StudentName" : "Larry",
"StudentMessage" : "Hello"
}
]
}
{
"_id" : ObjectId("5c92637936de59bd9de06382"),
"StudentDetails" : [
{
"StudentName" : "Carol",
"StudentMessage" : "Hello"
},
{
"StudentName" : "David",
"StudentMessage" : "Good Morning"
}
]
}$elemMatch를 활용한 실제 조회 예제
이제 StudentDetails 배열 내 객체의 StudentMessage 필드 값이 "Good Morning"인 문서를 조회해 보겠습니다. 쿼리는 다음과 같습니다.
> db.objectInAnArrayDemo.find({"StudentDetails": { $elemMatch: { "StudentMessage": "Good Morning" } } } ).pretty();위 쿼리의 실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c92637936de59bd9de06382"),
"StudentDetails" : [
{
"StudentName" : "Carol",
"StudentMessage" : "Hello"
},
{
"StudentName" : "David",
"StudentMessage" : "Good Morning"
}
]
}결과를 보면 두 번째 문서만 반환된 것을 확인할 수 있습니다. 이 문서의 StudentDetails 배열에는 StudentMessage 값이 "Good Morning"인 객체(David)가 포함되어 있기 때문입니다. 반면 첫 번째 문서(John, Larry)는 해당 조건을 만족하는 요소가 없어 결과에서 제외되었습니다.
참고 사항
단순히 점 표기법(dot notation)을 사용해 "StudentDetails.StudentMessage": "Good Morning"처럼 쿼리할 수도 있지만, 이 경우 하나의 배열 요소가 여러 조건을 동시에 만족해야 하는 상황에서 의도와 다른 결과가 나올 수 있습니다. 따라서 배열 내 단일 객체에 여러 조건을 적용하려면 $elemMatch를 사용하는 것이 가장 안전하고 정확한 방법입니다.