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

MongoDB에서 조건에 일치하는 여러 하위 문서의 필드 가져오기 ($unwind 활용)

MongoDB에서 조건에 맞는 여러 하위 문서의 필드 추출하기

배열 형태로 저장된 여러 하위 문서(sub-document)에서 특정 조건에 일치하는 필드 값을 추출하려면 MongoDB의 aggregate 파이프라인과 $unwind 연산자를 함께 사용하면 됩니다. 이 글에서는 실제 예제를 통해 단계별로 살펴보겠습니다.

1단계: 샘플 데이터로 컬렉션 생성

먼저 문서를 포함한 컬렉션을 생성합니다.

> db.demo671.insertOne(
... {
...    "details" : [
...    {
...       "id" : "1"
...    },
...    {
...       CountryName:"US",
...       "details1" : [
...       {
...          "id" : "1"
...       },
...       {
...          "id" : "2"
...       }
...       ]
...    },
... {
...    CountryName:"UK",
...    "details1" : [
...    {
...       "id" : "2"
...    },
...    {
...       "id" : "1"
...    }
...    ]
... },
... {
...    CountryName:"AUS",
...    "details1" : [
...       {
...          "id" : "1"
...       }
...       ]
...    }
... ]
... }
... )
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5ea3e5d004263e90dac943e0")
}

2단계: find() 메서드로 전체 문서 확인

find() 메서드를 사용하여 컬렉션의 모든 문서를 조회합니다.

> db.demo671.find();

이 명령은 다음과 같은 결과를 출력합니다.

{ "_id" : ObjectId("5ea3e5d004263e90dac943e0"), "details" : [ { "id" : "1" }, { "CountryName" : "US", "details1" : [ { "id" : "1" }, { "id" : "2" } ] }, { "CountryName" : "UK", "details1" : [ { "id" : "2" }, { "id" : "1" } ] }, { "CountryName" : "AUS", "details1" : [ { "id" : "1" } ] } ] }

3단계: 조건에 일치하는 하위 문서의 필드 조회 쿼리 실행

다음은 details1 배열 내부의 id가 '1'인 하위 문서를 찾아 해당 국가 이름(CountryName)을 추출하는 쿼리입니다.

> db.demo671.aggregate([
...
...   {$unwind: '$details'},
...
...   {$match: {'details.details1.id': '1'}},
...
...   {$project: {_id: 0, Country: '$details.CountryName'}}
... ]).pretty()

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

{ "Country" : "US" }
{ "Country" : "UK" }
{ "Country" : "AUS" }

쿼리 동작 원리

위 집계 파이프라인은 세 단계로 구성됩니다.

$unwind: details 배열의 각 요소를 개별 문서로 분해하여 처리 대상을 늘립니다.
$match: 분해된 문서 중 details1 배열 안에 id가 '1'인 항목을 포함하는 문서만 걸러냅니다.
$project: _id 필드는 제외하고, CountryName 값만 Country라는 새로운 필드 이름으로 출력합니다.

이처럼 $unwind로 배열을 펼친 뒤 $match로 조건을 걸고 $project로 필요한 필드만 선택하면, 중첩된 하위 문서 구조에서도 원하는 데이터를 손쉽게 추출할 수 있습니다.