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

MongoDB에서 하위 배열 값 추출하기 – $elemMatch 프로젝션 연산자 완벽 가이드

MongoDB에서 배열 안에 중첩된 특정 요소만 골라서 추출하고 싶다면 $elemMatch 프로젝션 연산자를 사용하면 됩니다. 이 연산자를 활용하면 문서 전체를 가져오지 않고도 조건에 맞는 배열 요소만 깔끔하게 조회할 수 있습니다.

1. 샘플 컬렉션 생성하기

먼저 예제로 사용할 컬렉션을 만들어 보겠습니다. insertOne() 메서드로 클라이언트 정보와 프로젝트 상세 데이터가 담긴 문서를 삽입합니다.

> db.extractSubArrayDemo.insertOne(
...    {
...       _id: 101,
...       "clientName":"Larry",
...       "ClientDetails":
...       [
...           {
...               "ClientProjectName":"Online Game",
...               "DeveloperTeamSize": 10
...           },
...           {
...               "ClientProjectName":"Pig Dice Game",
...               "DeveloperTeamSize": 12
...           },
...           {
...               "ClientProjectName":"Web Student Tracker",
...               "DeveloperTeamSize": 11
...           }
...       ]
...    }
... );
{ "acknowledged" : true, "insertedId" : 101 }

2. 저장된 문서 확인하기

find() 메서드를 사용해 컬렉션의 모든 문서를 조회해 보겠습니다.

> db.extractSubArrayDemo.find().pretty();

실행하면 다음과 같은 출력 결과를 확인할 수 있습니다.

{
    "_id" : 101,
    "clientName" : "Larry",
    "ClientDetails" : [
       {
           "ClientProjectName" : "Online Game",
           "DeveloperTeamSize" : 10
       },
       {
           "ClientProjectName" : "Pig Dice Game",
           "DeveloperTeamSize" : 12
       },
       {
           "ClientProjectName" : "Web Student Tracker",
           "DeveloperTeamSize" : 11
       }
    ]
}

3. $elemMatch로 하위 배열 값 추출하기

이제 $elemMatch 연산자를 사용해 특정 조건에 맞는 배열 요소만 추출하는 쿼리를 작성해 보겠습니다. 아래 예제에서는 'Pig Dice Game'이라는 프로젝트 이름을 가진 요소만 조회하며, _id: 0 옵션으로 불필요한 _id 필드는 제외했습니다.

> db.extractSubArrayDemo.find({ '_id': 101 },{ _id: 0, ClientDetails:
    { $elemMatch: {ClientProjectName: 'Pig Dice Game' } }}).pretty();

실행 결과는 다음과 같습니다.

{
    "ClientDetails" : [
       {
           "ClientProjectName" : "Pig Dice Game",
           "DeveloperTeamSize" : 12
       }
    ]
}

참고: 여러 개의 일치 요소를 추출하려면?

$elemMatch 프로젝션은 조건에 맞는 첫 번째 요소 하나만 반환한다는 점에 유의하세요. 조건을 만족하는 모든 배열 요소를 추출해야 한다면 집계 파이프라인(Aggregation Pipeline)의 $filter 연산자를 사용하는 것이 좋습니다.