Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 객체 배열 내 조건에 맞는 문서 찾기 – 이메일 주소 필드 일치 방법

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 연산자를 사용하는 것이 더 안전합니다. 또한 위 결과처럼 프로젝션 시 배열의 모든 요소 이름이 함께 출력되는데, 일치하는 요소 하나만 얻으려면 위치 연산자($)나 애그리게이션 파이프라인을 활용하면 됩니다.