MongoDB에서 특정 필드 값과 일치하는 문서를 조회하려면 aggregate() 메서드를 사용하면 됩니다. 이번 글에서는 배열 형태의 하위 문서에서 "Age" 필드 값이 21인 데이터만 추출하는 방법을 단계별로 살펴보겠습니다.
1. 컬렉션 생성 및 문서 삽입
먼저 예제에 사용할 컬렉션을 만들고 문서를 삽입합니다. 아래 예시에서는 details라는 배열 안에 여러 사람의 이름(Name)과 나이(Age) 정보가 들어 있습니다.
> db.demo685.insertOne(
... {
... "details":
... [
... {
... Name:"Chris",
... Age:21
... },
... {
... Name:"David",
... Age:23
... },
... {
... Name:"Bob",
... Age:21
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea54f6fa7e81adc6a0b395b")
}2. find() 메서드로 전체 문서 확인
find() 메서드를 사용하면 컬렉션의 모든 문서를 확인할 수 있습니다.
> db.demo685.find();
위 쿼리는 다음과 같은 결과를 출력합니다.
{ "_id" : ObjectId("5ea54f6fa7e81adc6a0b395b"), "details" : [
{ "Name" : "Chris", "Age" : 21 },
{ "Name" : "David", "Age" : 23 },
{ "Name" : "Bob", "Age" : 21 }
] }3. 집계 파이프라인으로 특정 값 조회
이제 집계(aggregation) 쿼리를 사용해 Age 값이 21인 문서만 추출해 보겠습니다. 핵심은 세 가지 단계입니다.
- $unwind:
details배열을 개별 문서로 분해합니다. - $match:
details.Age가 21인 문서만 필터링합니다. - $project: 불필요한
_id필드를 제거하여 깔끔한 결과를 출력합니다.
> db.demo685.aggregate([ { $unwind: "$details" }, { $match: { "details.Age": 21 } }, { $project: {_id: 0}} ]).pretty();실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.
{ "details" : { "Name" : "Chris", "Age" : 21 } }
{ "details" : { "Name" : "Bob", "Age" : 21 } }정리
배열 내부의 중첩된 문서에서 조건에 맞는 데이터를 찾으려면 단순히 find()만으로는 부족할 수 있습니다. 이럴 때 $unwind → $match → $project 순서로 구성된 집계 파이프라인을 활용하면 원하는 필드 값만 정확하고 효율적으로 추출할 수 있습니다.