개요
MongoDB에서 하위 배열(sub array)에 저장된 문서를 조회하려면 점(.) 표기법(dot notation)을 활용하면 됩니다. 점 표기법은 "필드명.내부필드명" 형태로 경로를 지정하여 중첩된 객체나 배열 요소에 접근하는 방식입니다. 이번 글에서는 실제 예제를 통해 하위 배열 내부에서 조건에 맞는 문서를 검색하는 과정을 단계별로 살펴보겠습니다.
1. 예제 컬렉션 생성하기
먼저 insertOne() 메서드를 사용하여 직원 정보가 담긴 문서 두 개를 생성합니다. 각 문서에는 EmployeeDetails 객체 안에 EmployeeAppraisalTime이라는 하위 배열이 존재하며, 배열의 각 요소는 직급(EmployeeDesignation)과 연봉(Salary) 정보로 구성되어 있습니다.
> db.findDocumentDemo.insertOne(
... {
... "EmployeeDetails" :
... {
... "EmployeeAppraisalTime":
... [
... {"EmployeeDesignation": "Developer", "Salary": 45000},
... {"EmployeeDesignation": "Tester", "Salary": 30000},
... {"EmployeeDesignation": "HR", "Salary": 22000},
... {"EmployeeDesignation": "Accountant", "Salary": 18000}
... ]
... }
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd2c0f7b64f4b851c3a13a8")
}
> db.findDocumentDemo.insertOne(
... {
... "EmployeeDetails" :
... {
... "EmployeeAppraisalTime":
... [
... {"EmployeeDesignation": "Developer", "Salary": 105000},
... {"EmployeeDesignation": "Tester", "Salary": 45000},
... {"EmployeeDesignation": "HR", "Salary": 34000},
... {"EmployeeDesignation": "Accountant", "Salary": 24000}
... ]
... }
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd2c1d5b64f4b851c3a13a9")
}
2. 전체 문서 확인하기
find() 메서드에 pretty() 메서드를 함께 사용하면 컬렉션에 저장된 모든 문서를 보기 좋게 정렬된 형태로 출력할 수 있습니다.
> db.findDocumentDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5cd2c0f7b64f4b851c3a13a8"),
"EmployeeDetails" : {
"EmployeeAppraisalTime" : [
{
"EmployeeDesignation" : "Developer",
"Salary" : 45000
},
{
"EmployeeDesignation" : "Tester",
"Salary" : 30000
},
{
"EmployeeDesignation" : "HR",
"Salary" : 22000
},
{
"EmployeeDesignation" : "Accountant",
"Salary" : 18000
}
]
}
}
{
"_id" : ObjectId("5cd2c1d5b64f4b851c3a13a9"),
"EmployeeDetails" : {
"EmployeeAppraisalTime" : [
{
"EmployeeDesignation" : "Developer",
"Salary" : 105000
},
{
"EmployeeDesignation" : "Tester",
"Salary" : 45000
},
{
"EmployeeDesignation" : "HR",
"Salary" : 34000
},
{
"EmployeeDesignation" : "Accountant",
"Salary" : 24000
}
]
}
}3. 하위 배열에서 문서 조회하기
이제 핵심인 하위 배열 검색 쿼리를 살펴보겠습니다. 점 표기법으로 'EmployeeDetails.EmployeeAppraisalTime.EmployeeDesignation'처럼 경로를 지정하여 직급이 'Developer'인 요소를 찾고, $in 연산자를 사용해 Salary 값이 45000 또는 105000에 해당하는 문서를 조회합니다.
> db.findDocumentDemo.find({ 'EmployeeDetails.EmployeeAppraisalTime.EmployeeDesignation': 'Developer', 'EmployeeDetails.EmployeeAppraisalTime.Salary': { '$in': [45000,105000] } } );쿼리를 실행하면 다음과 같은 결과가 반환됩니다.
{ "_id" : ObjectId("5cd2c0f7b64f4b851c3a13a8"), "EmployeeDetails" : { "EmployeeAppraisalTime" : [ { "EmployeeDesignation" : "Developer", "Salary" : 45000 }, { "EmployeeDesignation" : "Tester", "Salary" : 30000 }, { "EmployeeDesignation" : "HR", "Salary" : 22000 }, { "EmployeeDesignation" : "Accountant", "Salary" : 18000 } ] } }
{ "_id" : ObjectId("5cd2c1d5b64f4b851c3a13a9"), "EmployeeDetails" : { "EmployeeAppraisalTime" : [ { "EmployeeDesignation" : "Developer", "Salary" : 105000 }, { "EmployeeDesignation" : "Tester", "Salary" : 45000 }, { "EmployeeDesignation" : "HR", "Salary" : 34000 }, { "EmployeeDesignation" : "Accountant", "Salary" : 24000 } ] } }정리 및 추가 팁
이처럼 MongoDB에서는 점 표기법을 사용하면 중첩된 객체나 하위 배열 내부의 필드에 손쉽게 접근할 수 있으며, $in 같은 비교 연산자를 함께 활용하면 더욱 유연한 조건 검색이 가능합니다.
다만 위 쿼리는 직급 조건과 연봉 조건이 서로 다른 배열 요소에서 각각 일치해도 문서를 반환한다는 점에 유의해야 합니다. 만약 동일한 하나의 배열 요소가 두 조건을 모두 만족해야 하는 경우라면 $elemMatch 연산자를 사용하는 것이 올바른 방법입니다. 상황에 맞게 두 방식을 구분하여 사용하면 정확한 데이터 조회가 가능합니다.