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

MongoDB 임베디드 문서에서 특정 요소를 찾는 방법 ($unwind, $match, $project 활용)

MongoDB에서 임베디드(내장) 문서 배열 안에 있는 특정 요소를 찾으려면 집계(aggregation) 파이프라인의 $project 연산자를 활용하면 됩니다. 이 글에서는 $unwind, $match, $project 세 단계를 조합하여 배열 내 조건에 맞는 요소만 추출하는 방법을 단계별로 살펴보겠습니다.

1. 샘플 컬렉션 생성하기

먼저 학생 정보를 담은 배열 필드 studentInformation을 포함하는 문서를 demo744 컬렉션에 삽입합니다.

> db.demo744.insertOne(
...    {
...       studentInformation:
...       [
...          {
...             studentName:"Robert",
...             grade:"A"
...          },
...          {
...             studentName:"Bob",
...             grade:"C"
...          },
...          {
...             studentName:"John",
...             grade:"B"
...          },
...          {
...             studentName:"Sam",
...             grade:"A"
...          }
...       ]
...    }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5ead928a57bb72a10bcf0684")
}

2. find() 메서드로 전체 문서 확인하기

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

> db.demo744.find();

실행 결과는 다음과 같습니다.

{ "_id" : ObjectId("5ead928a57bb72a10bcf0684"), "studentInformation" : [ { "studentName" : "Robert", "grade" : "A" }, { "studentName" : "Bob", "grade" : "C" }, { "studentName" : "John", "grade" : "B" }, { "studentName" : "Sam", "grade" : "A" } ] }

3. 집계 파이프라인으로 특정 요소 찾기

임베디드 문서 배열에서 성적(grade)이 "A"인 학생만 추출하려면 아래와 같이 세 가지 집계 단계를 순서대로 적용합니다.

  • $unwind: 배열 필드를 각 요소별 개별 문서로 분해합니다.
  • $match: grade가 "A"인 문서만 필터링합니다.
  • $project: studentName 필드만 선택하여 출력합니다.
> db.demo744.aggregate(
...    { $unwind: '$studentInformation' },
...    { $match: {'studentInformation.grade':"A"}},
...    { $project: {"studentInformation.studentName": 1}}
... )

위 쿼리를 실행하면 grade가 "A"인 Robert와 Sam의 이름만 출력되는 것을 확인할 수 있습니다.

{ "_id" : ObjectId("5ead928a57bb72a10bcf0684"), "studentInformation" : { "studentName" : "Robert" } }
{ "_id" : ObjectId("5ead928a57bb72a10bcf0684"), "studentInformation" : { "studentName" : "Sam" } }

마무리

이처럼 MongoDB에서는 $unwind로 배열을 분해한 뒤 $match로 조건을 걸고, $project로 필요한 필드만 추출하는 방식으로 임베디드 문서 내 특정 요소를 손쉽게 조회할 수 있습니다. 이 패턴은 대량의 배열 데이터에서 원하는 항목만 골라낼 때 매우 유용하게 활용됩니다.