MongoDB에서 배열 안에 저장된 데이터 중 특정 값만 가져오고 싶을 때가 있습니다. 이럴 때는 aggregate() 메서드와 함께 $project 연산자를 사용하면 원하는 값만 깔끔하게 추출할 수 있습니다.
1. 테스트용 컬렉션 생성하기
먼저 예제에 사용할 컬렉션을 만들고 문서를 삽입해 보겠습니다.
> db.demo761.insertOne(
... {
... "details": [
... {
... "student": {
... "FullName": "Chris Brown"
... }
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5eb034d15637cd592b2a4af1")
}
> db.demo761.insertOne(
... {
... "details": [
... {
... "student": {
... "FullName": "Chris Taylor"
... }
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5eb034d25637cd592b2a4af2")
}위 코드에서는 demo761이라는 컬렉션에 details라는 배열 필드를 가진 두 개의 문서를 삽입했습니다. 각 배열 요소는 student.FullName 형태의 중첩 구조로 되어 있습니다.
2. find()로 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.demo761.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5eb034d15637cd592b2a4af1"), "details" : [ { "student" : { "FullName" : "Chris Brown" } } ] }
{ "_id" : ObjectId("5eb034d25637cd592b2a4af2"), "details" : [ { "student" : { "FullName" : "Chris Taylor" } } ] }3. aggregate()로 배열 내 특정 값 쿼리하기
이제 배열 안에서 특정 조건에 맞는 값만 추출하는 방법을 살펴보겠습니다. 핵심은 세 단계의 파이프라인입니다.
- $unwind:
details배열을 개별 문서로 분해합니다. - $match:
FullName이 'Chris Taylor'인 문서만 필터링합니다. - $project: 필요한 필드만 선택하고
_id는 제외하여 결과를 정리합니다.
> db.demo761.aggregate([
... {'$unwind':'$details'},
... {'$match': {
... 'details.student.FullName':'Chris Taylor',
... }},
... {'$project': {
... 'details.student.FullName': 1, '_id': 0
... }},
... ])위 쿼리를 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.
{ "details" : { "student" : { "FullName" : "Chris Taylor" } } }마무리
이처럼 MongoDB에서 배열 내부의 특정 값을 조회할 때는 $unwind → $match → $project 순서의 애그리게이션 파이프라인을 활용하면 효율적입니다. $unwind로 배열을 펼친 뒤 조건에 맞는 문서를 걸러내고, $project로 원하는 필드만 남기면 불필요한 데이터 없이 정확히 필요한 값만 얻을 수 있습니다.