MongoDB에서 배열 형태로 저장된 내장 문서(Embedded Document)를 조건에 맞게 조회하려면 aggregate() 메서드를 사용하는 것이 효과적입니다. 이 글에서는 예제 컬렉션을 만들고, $unwind와 $match 파이프라인 단계를 활용해 내장 문서를 필터링하는 과정을 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성하기
먼저 insertOne() 메서드를 사용하여 내장 문서 배열을 포함한 도큐먼트를 컬렉션에 삽입합니다.
> db.demo705.insertOne(
... {
... _id:101,
... "Information":
... [
... {
... "StudentName":"Chris",
... "StudentAge":21
... },
... {
... "StudentName":"David",
... "StudentAge":23
... },
... {
... "StudentName":"Bob",
... "StudentAge":20
... }
... ]
... }
... );
{ "acknowledged" : true, "insertedId" : 101 }삽입이 성공적으로 완료되면 위와 같이 insertedId가 반환됩니다.
2. find()로 전체 도큐먼트 확인하기
find() 메서드를 사용하면 컬렉션의 모든 도큐먼트를 조회할 수 있습니다.
> db.demo705.find();
실행 결과는 다음과 같습니다.
{ "_id" : 101, "Information" : [ { "StudentName" : "Chris", "StudentAge" : 21 }, { "StudentName" : "David", "StudentAge" : 23 }, { "StudentName" : "Bob", "StudentAge" : 20 } ] }3. aggregate()로 내장 문서 쿼리하기
배열 안의 각 내장 문서를 개별 도큐먼트처럼 다루려면 먼저 $unwind로 배열을 분해하고, $match로 조건을 걸어준 뒤, $project로 필요한 필드만 출력하면 됩니다.
아래 예제는 StudentAge가 21 이상인 학생 정보만 조회하는 쿼리입니다.
> db.demo705.aggregate(
... { $unwind: '$Information' },
... { $match: {'Information.StudentAge': {$gte: 21}}},
... { $project: {Information: 1}}
... )쿼리 실행 결과는 다음과 같습니다.
{ "_id" : 101, "Information" : { "StudentName" : "Chris", "StudentAge" : 21 } }
{ "_id" : 101, "Information" : { "StudentName" : "David", "StudentAge" : 23 } }정리
aggregate() 파이프라인에서 $unwind는 Information 배열의 요소들을 각각 별도의 도큐먼트로 펼쳐주고, $match는 StudentAge가 21 이상($gte)인 문서만 남깁니다. 그 결과 나이가 20세인 Bob은 제외되고 Chris(21세)와 David(23세)의 정보만 출력되는 것을 확인할 수 있습니다. 이처럼 $unwind → $match → $project 순서의 파이프라인 구성은 MongoDB에서 내장 문서를 유연하게 필터링할 때 가장 널리 쓰이는 패턴입니다.