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 프로젝션을 함께 활용하는 것이 좋습니다.