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로 필요한 필드만 추출하는 방식으로 임베디드 문서 내 특정 요소를 손쉽게 조회할 수 있습니다. 이 패턴은 대량의 배열 데이터에서 원하는 항목만 골라낼 때 매우 유용하게 활용됩니다.