MongoDB에서 find() 메서드를 사용해 중첩된 키(nested key), 즉 내부 필드를 검색하려면 점(.) 표기법(dot notation)을 활용하면 됩니다. 외부 필드명과 내부 필드명을 마침표로 연결해 하나의 문자열로 묶어 쿼리 조건으로 지정하는 방식입니다.
중첩 키 검색 기본 문법
db.yourCollectionName.find({"yourOuterFieldName.yourInnerFieldName":"yourValue"}).pretty();이때 주의할 점은 외부필드명.내부필드명 전체를 반드시 따옴표(" ")로 감싸야 한다는 것입니다. 따옴표 없이 작성하면 자바스크립트 객체 리터럴 문법 오류가 발생합니다.
1. 예제용 컬렉션 생성
먼저 실습에 사용할 컬렉션과 문서를 생성해 보겠습니다.
> db.searchForNestedKeysDemo.insertOne({"ClientName":"Larry","ClientAge":28,"ClientExtraDetails":{"isEducated":true,"CountryName":"US"}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ca20e8b66324ffac2a7dc64")
}
> db.searchForNestedKeysDemo.insertOne({"ClientName":"Chris","ClientAge":29,"ClientExtraDetails":{"isEducated":false,"CountryName":"UK"}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ca20ea366324ffac2a7dc65")
}
> db.searchForNestedKeysDemo.insertOne({"ClientName":"David","ClientAge":39,"ClientExtraDetails":{"isEducated":true,"CountryName":"AUS"}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ca20eba66324ffac2a7dc66")
}위 예제에서는 ClientExtraDetails라는 외부 필드 안에 isEducated와 CountryName이라는 내부 필드가 중첩되어 있는 구조입니다.
2. 저장된 전체 문서 확인
find() 메서드로 컬렉션의 모든 문서를 조회해 보겠습니다.
> db.searchForNestedKeysDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5ca20e8b66324ffac2a7dc64"),
"ClientName" : "Larry",
"ClientAge" : 28,
"ClientExtraDetails" : {
"isEducated" : true,
"CountryName" : "US"
}
}
{
"_id" : ObjectId("5ca20ea366324ffac2a7dc65"),
"ClientName" : "Chris",
"ClientAge" : 29,
"ClientExtraDetails" : {
"isEducated" : false,
"CountryName" : "UK"
}
}
{
"_id" : ObjectId("5ca20eba66324ffac2a7dc66"),
"ClientName" : "David",
"ClientAge" : 39,
"ClientExtraDetails" : {
"isEducated" : true,
"CountryName" : "AUS"
}
}3. 점(.) 표기법으로 중첩 키 검색하기
이제 본격적으로 중첩된 키를 검색하는 쿼리를 실행해 보겠습니다. 여기서는 ClientExtraDetails.CountryName 값이 "UK"인 문서를 찾습니다.
> db.searchForNestedKeysDemo.find({"ClientExtraDetails.CountryName":"UK"}).pretty();실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5ca20ea366324ffac2a7dc65"),
"ClientName" : "Chris",
"ClientAge" : 29,
"ClientExtraDetails" : {
"isEducated" : false,
"CountryName" : "UK"
}
}조건에 일치하는 Chris의 문서만 정확히 반환된 것을 확인할 수 있습니다.
추가 팁: 더 깊은 중첩 구조도 동일하게 처리 가능
점 표기법은 한 단계가 아닌 여러 단계의 중첩에도 그대로 적용됩니다. 예를 들어 a.b.c처럼 세 단계 깊이의 필드도 {"a.b.c": "값"} 형태로 검색할 수 있습니다.
또한 배열 요소 내부의 필드를 검색할 때도 점 표기법을 사용합니다. 예를 들어 items.name은 배열 items 안의 각 요소가 가진 name 필드를 대상으로 조건을 평가합니다.
- 문자열 필드 검색:
{"외부필드.내부필드": "값"} - 숫자·불린 필드 검색:
{"외부필드.내부필드": true}또는{"외부필드.내부필드": 28} - 비교 연산자 활용:
{"외부필드.내부필드": { $gte: 30 }}
이처럼 MongoDB의 점(.) 표기법만 익혀두면 중첩된 문서 구조 어디에 있는 데이터든 손쉽게 조회할 수 있습니다.