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

MongoDB에서 객체 배열 검색하는 방법 – $unwind와 $match 활용하기

MongoDB에서 객체로 이루어진 배열을 검색하려면 aggregate() 메서드와 함께 $unwind 연산자를 사용하면 됩니다. 그리고 특정 조건에 맞는 문서를 필터링할 때는 $match를 활용합니다.

샘플 컬렉션 생성하기

먼저 예제 문서를 포함한 컬렉션을 만들어 보겠습니다.

> db.demo623.insertOne(
...     {
...        _id:1,
...        details:[
...           {
...              Name:"Chris"
...           },
...           {
...              DueDate:new ISODate("2020-01-10")
...           },
...           {
...              CountryName:"US"
...           }
...        ]
...    }
... );
{ "acknowledged" : true, "insertedId" : 1 }

저장된 문서 확인하기

find() 메서드를 사용하면 컬렉션의 모든 문서를 조회할 수 있습니다.

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

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

{
    "_id" : 1,
    "details" : [
       {
          "Name" : "Chris"
       },
       {
          "DueDate" : ISODate("2020-01-10T00:00:00Z")
       },
       {
          "CountryName" : "US"
       }
    ]
}

객체 배열 검색 쿼리 작성하기

이제 MongoDB에서 객체 배열을 검색하는 실제 쿼리를 살펴보겠습니다. $unwind로 배열을 개별 문서로 분해한 뒤, $match로 원하는 값을 가진 요소만 걸러내고, $project로 필요한 필드만 추출합니다.

> db.demo623.aggregate({$unwind: "$details"},
... {$match: {"details.Name":"Chris"}},
... {$project: {"details.Name": 1}})

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

{ "_id" : 1, "details" : { "Name" : "Chris" } }

동작 원리 정리

$unwinddetails 배열의 각 요소를 별도의 문서로 펼쳐주는 역할을 합니다. 이후 $matchName 값이 "Chris"인 문서만 남기고, 마지막으로 $projectName 필드만 화면에 표시하도록 지정합니다. 이 세 단계를 조합하면 객체 배열 안에서도 원하는 데이터를 손쉽게 검색할 수 있습니다.