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

MongoDB에서 배열 쿼리로 특정 값만 추출하는 방법 ($unwind와 $project 활용)

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로 원하는 필드만 남기면 불필요한 데이터 없이 정확히 필요한 값만 얻을 수 있습니다.