MongoDB에서 배열 안에 저장된 객체의 일부 필드만 가지고 문서를 조회해야 하는 경우가 자주 있습니다. 이번 글에서는 배열 요소 전체가 정확히 일치해야 하는 방법과, 점 표기법(dot notation)을 활용해 부분 일치로 조회하는 두 가지 방법을 예제와 함께 살펴보겠습니다.
1. 샘플 데이터 준비하기
먼저 실습에 사용할 컬렉션을 생성하고 문서를 삽입하겠습니다. insertOne() 메서드를 사용하여 학생 정보가 담긴 배열을 포함한 문서 두 개를 추가합니다.
> db.queryForPartialObjectDemo.insertOne({_id:new ObjectId(), "StudentDetails": [{"StudentId":1, "StudentName":"Chris"}]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cdfcf55bf3115999ed51206")
}
> db.queryForPartialObjectDemo.insertOne({_id:new ObjectId(), "StudentDetails": [{"StudentId":2, "StudentName":"David"}]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cdfcf55bf3115999ed51207")
}데이터가 정상적으로 들어갔는지 확인하기 위해 find() 메서드와 pretty() 메서드를 함께 사용해 컬렉션의 모든 문서를 조회해 보겠습니다.
> db.queryForPartialObjectDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5cdfcf55bf3115999ed51206"),
"StudentDetails" : [
{
"StudentId" : 1,
"StudentName" : "Chris"
}
]
}
{
"_id" : ObjectId("5cdfcf55bf3115999ed51207"),
"StudentDetails" : [
{
"StudentId" : 2,
"StudentName" : "David"
}
]
}방법 1: 객체 전체를 조건으로 지정
배열 요소를 직접 조건으로 지정하는 첫 번째 방법입니다. 이 방식은 배열 내 객체의 모든 필드가 정확히 일치해야만 문서가 검색됩니다.
> db.queryForPartialObjectDemo.find({StudentDetails: {StudentId: 1, "StudentName" : "Chris"}});실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5cdfcf55bf3115999ed51206"), "StudentDetails" : [ { "StudentId" : 1, "StudentName" : "Chris" } ] }주의할 점은, 만약 {StudentDetails: {StudentName: "Chris"}}처럼 필드 하나만 지정하면 아무런 결과도 반환되지 않습니다. MongoDB는 배열 요소를 객체 단위로 비교하기 때문에 객체 구조 전체가 일치해야 하기 때문입니다.
방법 2: 점 표기법(Dot Notation) 활용
배열 내 객체의 특정 필드 값만으로 조회하고 싶다면 점 표기법을 사용하는 것이 좋습니다. "배열필드명.객체내부필드명" 형태로 조건을 작성하면 해당 필드 값이 일치하는 모든 문서를 손쉽게 찾을 수 있습니다.
> db.queryForPartialObjectDemo.find({"StudentDetails.StudentName":"Chris"});실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5cdfcf55bf3115999ed51206"), "StudentDetails" : [ { "StudentId" : 1, "StudentName" : "Chris" } ] }마무리
정리하면 다음과 같습니다.
- 객체 전체 일치 조회: 배열 요소의 모든 필드가 순서와 값까지 정확히 일치해야 합니다.
- 점 표기법 조회: 배열 내 객체의 특정 필드 값만으로도 유연하게 검색할 수 있어 실무에서 더 널리 사용됩니다.
배열 내 중첩된 객체를 다룰 때는 대부분 점 표기법을 활용하는 것이 효율적이며, 필요에 따라 $elemMatch 연산자를 함께 사용하면 더욱 복잡한 조건의 조회도 가능합니다.