MongoDB에서 배열 형태로 저장된 중첩 문서(nested document) 안의 특정 값을 검색하려면 $match 연산자를 사용하면 됩니다. 이 글에서는 예제 컬렉션을 만들고, 집계 파이프라인(aggregate)을 활용해 원하는 값을 조회하는 과정을 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성
먼저 insertOne() 메서드를 사용해 StudentInformation이라는 중첩 배열 필드를 가진 문서를 생성합니다.
> db.demo648.insertOne(
... {
... StudentInformation:
... [
... {
... Name:"John",
... CountryName:"US"
... },
... {
... Name:"David",
... CountryName:"AUS"
... },
... {
... Name:"Chris",
... CountryName:"US"
... },
... {
... Name:"Robert",
... CountryName:"UK"
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9c8b286c954c74be91e6f5")
}2. 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.demo648.find();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e9c8b286c954c74be91e6f5"), "StudentInformation" : [
{ "Name" : "John", "CountryName" : "US" },
{ "Name" : "David", "CountryName" : "AUS" },
{ "Name" : "Chris", "CountryName" : "US" },
{ "Name" : "Robert", "CountryName" : "UK" }
] }3. 중첩 문서 값 검색 쿼리 작성
이제 배열로 된 중첩 문서에서 특정 값을 검색해 보겠습니다. 핵심은 세 단계의 파이프라인으로 구성된 집계 쿼리입니다.
- $unwind:
StudentInformation배열의 각 요소를 개별 문서로 분리합니다. - $match: 분리된 문서 중
CountryName이 "US"인 것만 필터링합니다. - $project: 결과에서 불필요한
_id필드를 제거하여 깔끔한 출력을 만듭니다.
> db.demo648.aggregate([
... { $unwind: "$StudentInformation" },
... { $match: { "StudentInformation.CountryName": "US" } },
... { $project: {_id: 0}}
... ])4. 실행 결과
위 쿼리를 실행하면 국가명이 "US"인 학생 정보만 정확히 추출됩니다.
{ "StudentInformation" : { "Name" : "John", "CountryName" : "US" } }
{ "StudentInformation" : { "Name" : "Chris", "CountryName" : "US" } }정리
MongoDB에서 중첩 배열 문서의 값을 검색할 때는 $unwind로 배열을 풀어낸 뒤 $match로 조건에 맞는 데이터를 걸러내는 것이 가장 일반적인 패턴입니다. 마지막에 $project를 함께 사용하면 필요한 필드만 선택적으로 출력할 수 있어 가독성 좋은 결과를 얻을 수 있습니다.