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

MongoDB에서 중첩된 JSON 배열의 값을 검색하는 방법

MongoDB에서 중첩된(nested) JSON 배열 안에 저장된 값을 검색하려면 점 표기법(dot notation)find() 메서드를 조합하면 됩니다. 외부 필드명부터 가장 안쪽 필드명까지 점(.)으로 연결해 경로를 지정하고, 찾고자 하는 값을 조건으로 넘겨주는 방식입니다.

기본 문법

db.yourCollectionName.find({"외부필드명.내부필드명.그다음내부필드명...N": "찾을값"}).pretty();

이제 실제 예제를 통해 단계별로 살펴보겠습니다.

1단계: 샘플 컬렉션 생성 및 문서 삽입

먼저 실습에 사용할 컬렉션을 생성하고 문서를 삽입합니다. 아래 예제는 ClientDetails 객체 안에 ClientPersonalDetails라는 배열이 중첩된 구조입니다.

> db.nestedJSONArrayDemo.insertOne({
...     "ClientDetails" :
...     {
...        "ClientPersonalDetails" : [
...           { "CountryName" : "US" },
...           { "CountryName" : "AUS"},
...           { "ClientName":"Chris" },
...           { "ClientName":"David" }
...        ]
...     }
... });
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd2cbb2b64f4b851c3a13bc")
}
> db.nestedJSONArrayDemo.insertOne({
...     "ClientDetails" :
...     {
...        "ClientPersonalDetails" : [
...           { "CountryName" : "Belgium" },
...           { "CountryName" : "Canada"},
...           { "CountryName" : "Egypt"},
...        ]
...     }
... });
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd2cc14b64f4b851c3a13bd")
}

2단계: 전체 문서 조회하기

find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.

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

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

{
   "_id" : ObjectId("5cd2cbb2b64f4b851c3a13bc"),
   "ClientDetails" : {
      "ClientPersonalDetails" : [
         {
            "CountryName" : "US"
         },
         {
            "CountryName" : "AUS"
         },
         {
            "ClientName" : "Chris"
         },
         {
            "ClientName" : "David"
         }
      ]
   }
}
{
   "_id" : ObjectId("5cd2cc14b64f4b851c3a13bd"),
   "ClientDetails" : {
      "ClientPersonalDetails" : [
         {
            "CountryName" : "Belgium"
         },
         {
            "CountryName" : "Canada"
         },
         {
            "CountryName" : "Egypt"
         }
      ]
   }
}

3단계: 중첩 배열에서 특정 값 검색하기

이제 핵심인 검색 쿼리입니다. ClientDetails.ClientPersonalDetails.CountryName처럼 경로를 점으로 연결하고, 조건값으로 Canada를 지정해 보겠습니다.

> db.nestedJSONArrayDemo.find({"ClientDetails.ClientPersonalDetails.CountryName": "Canada"}).pretty();

실행 결과, 해당 조건을 만족하는 문서만 반환됩니다.

{
   "_id" : ObjectId("5cd2cc14b64f4b851c3a13bd"),
   "ClientDetails" : {
      "ClientPersonalDetails" : [
         {
            "CountryName" : "Belgium"
         },
         {
            "CountryName" : "Canada"
         },
         {
            "CountryName" : "Egypt"
         }
      ]
   }
}

추가 팁

배열 전체가 아니라 특정 인덱스 위치의 요소만 검색하고 싶다면 경로에 숫자 인덱스를 포함하면 됩니다. 예를 들어 첫 번째 요소의 국가명을 기준으로 검색하려면 다음과 같이 작성합니다.

> db.nestedJSONArrayDemo.find({"ClientDetails.ClientPersonalDetails.0.CountryName": "Belgium"});

또한 검색 시 반환되는 문서에는 배열의 모든 요소가 함께 출력됩니다. 일치하는 요소만 추출하고 싶다면 집계 파이프라인의 $filter$elemMatch 프로젝션을 함께 활용하는 것이 좋습니다.