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

MongoDB에서 중첩 문서 값 검색 방법 – $match와 $unwind 활용하기

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를 함께 사용하면 필요한 필드만 선택적으로 출력할 수 있어 가독성 좋은 결과를 얻을 수 있습니다.