MongoDB에서 객체 배열(array of objects) 형태로 저장된 데이터 안에서 특정 조건에 맞는 문서를 찾고, 이메일 주소 필드까지 함께 일치시켜야 하는 경우가 자주 있습니다. 이번 글에서는 find() 메서드와 점 표기법(dot notation)을 활용해 이를 처리하는 방법을 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성 및 문서 삽입
먼저 데모용 컬렉션을 생성한 뒤, 직원 정보를 담은 객체 배열이 포함된 문서를 삽입합니다.
> db.demo144.insertOne({"EmployeeDetails":[{"EmployeeName":"Chris","EmployeeEmail":"Chris12@gmail.com"},{"EmployeeName":"Bob","EmployeeEmail":"bo22@gmail.com"}]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e32f1d8fdf09dd6d08539b9")
}
> db.demo144.insertOne({"EmployeeDetails":[{"EmployeeName":"David","EmployeeEmail":"david@gmail.com"},{"EmployeeName":"Carol","EmployeeEmail":"Carol@gmail.com"}]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e32f1f5fdf09dd6d08539ba")
}각 문서는 EmployeeDetails라는 필드에 여러 직원의 이름과 이메일 주소를 배열 형태로 가지고 있습니다.
2. 컬렉션의 모든 문서 조회하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.demo144.find();
위 명령을 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5e32f1d8fdf09dd6d08539b9"), "EmployeeDetails" : [
{ "EmployeeName" : "Chris", "EmployeeEmail" : "Chris12@gmail.com" },
{ "EmployeeName" : "Bob", "EmployeeEmail" : "bo22@gmail.com" }
]
}
{
"_id" : ObjectId("5e32f1f5fdf09dd6d08539ba"), "EmployeeDetails" : [
{ "EmployeeName" : "David", "EmployeeEmail" : "david@gmail.com" },
{ "EmployeeName" : "Carol", "EmployeeEmail" : "Carol@gmail.com" }
]
}3. 객체 배열 내에서 이름과 이메일 주소가 모두 일치하는 문서 찾기
다음은 점 표기법(EmployeeDetails.EmployeeName, EmployeeDetails.EmployeeEmail)을 사용해 객체 배열 내부의 값을 조건으로 지정하고, 프로젝션(projection)으로 이름 필드만 반환받는 쿼리입니다.
> db.demo144.find({"EmployeeDetails.EmployeeName":"David","EmployeeDetails.EmployeeEmail":"david@gmail.com"},{"EmployeeDetails.EmployeeName":1});실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e32f1f5fdf09dd6d08539ba"), "EmployeeDetails" : [ { "EmployeeName" : "David" }, { "EmployeeName" : "Carol" } ] }조건에 맞는 두 번째 문서만 정상적으로 반환된 것을 확인할 수 있습니다.
참고 사항
점 표기법으로 여러 조건을 지정하면 각 조건이 배열의 서로 다른 요소에서 일치할 수도 있습니다. 두 조건이 반드시 동일한 배열 요소에서 동시에 일치해야 한다면 $elemMatch 연산자를 사용하는 것이 더 안전합니다. 또한 위 결과처럼 프로젝션 시 배열의 모든 요소 이름이 함께 출력되는데, 일치하는 요소 하나만 얻으려면 위치 연산자($)나 애그리게이션 파이프라인을 활용하면 됩니다.