DB/마스터링 몽고DB 7.0

[7장] 몽고DB 고급 쿼리

꾸준함. 2025. 7. 15. 00:29

집계 프레임워크 소개

  • 몽고DB의 집계 프레임워크는 정교한 데이터 변환과 분석을 수행할 수 있는 강력한 데이터 처리 도구
  • 집계 프레임워크의 핵심은 파이프라인 개념에 있음
    • 데이터는 파이프라인의 각 단계를 순차적으로 통과하며 변환되는데, 각 단계의 출력이 다음 단계의 입력으로 이어지는 연속적인 처리 과정을 거치게 됨
    • 이러한 설계는 복잡한 데이터 처리 작업을 논리적이고 단계적인 방식으로 구성할 수 있게 해 줌

 

  • 집계 프레임워크의 유연하고 표현력 있는 문법은 다양한 수준의 데이터 처리를 가능하게 함
    • 간단한 필터링이나 그룹화부터 문서 전체의 구조를 재구성하는 복잡한 작업까지 수행할 수 있어, 다양한 비즈니스 요구사항에 대응할 수 있음


 

몽고DB의 집계가 제공하는 이점

  • 몽고DB의 집계 시스템은 데이터를 효과적으로 처리하고 분석할 수 있는 강력한 기능을 제공하며 집계 프레임워크를 통해 데이터를 다양한 방식으로 변환하고 통합함으로써, 심도 있는 데이터 분석과 의미 있는 인사이트 도출이 가능함
  • 몽고DB 집계 시스템의 주요 이점은 네 가지 측면에서 살펴볼 수 있음
    • 성능: 데이터베이스 내부에서 직접 처리되는 네이티브 작업은 외부 처리 방식보다 월등히 빠른 처리 속도를 제공함
    • 유연성: 다양한 도구와 연산자를 제공하여 복잡한 데이터 변환 작업을 효율적으로 수행할 수 있으며, 이는 외부 처리 로직의 의존도를 크게 줄여줌
    • 데이터 무결성: 데이터베이스 수준의 작업을 통해 일관성과 신뢰성을 보장하며 이는 동기화나 트랜잭션 문제가 발생하기 쉬운 외부 처리 방식과 비교할 때 큰 장점이 됨
    • 자원 효율성: 데이터베이스 내부 처리는 네트워크 대역폭 사용을 최소화하고 애플리케이션 서버의 부하를 줄여줌

 

집계 스테이지

  • 집계 스테이지는 데이터 파이프라인에서 데이터 변환이 이루어지는 단계를 의미하며 각 단계에서는 데이터를 처리하여 후속 단계에서 추가 처리가 가능한 형태의 문서를 생성함
  • 몽고DB의 집계 프레임워크는 데이터 처리와 분석을 위한 강력한 도구 시스템이며 기본 CRUD 작업의 범위를 넘어서 데이터의 변환, 필터링, 그리고 의미 있는 통찰력 도출을 가능하게 하는 유연하고 효율적인 방법을 제공함
  • 파이프라인의 핵심을 이루는 주요 단계들은 다음과 같음
    • $match: $match는 지정된 조건에 부합하는 문서만을 선별하여 파이프라인의 다음 단계로 전달하는 연산자이며 초기 단계에서 활용하는 것이 바람직함
    • $limit: 필요한 결과만을 효율적으로 얻기 위해서는 파이프라인의 초기 단계에서 $limit을 사용하여 후속 단계에서 처리해야 할 문서의 수를 제한하는 것을 권장
    • $sort: 데이터 정렬이 필요한 경우, 정렬 인덱스가 이미 구성되어 있다면 이를 활용하는 것이 성능 최적화에 매우 효과적
    • $skip: 파이프라인에서 처음 N개의 문서를 제외한 나머지 문서를 후속 단계로 전달하는 역할
    • $project, $set, $addFields: 문서의 구조를 변경하는 데 사용되며, 주로 파이프라인의 최종 단계에서 활용되는데 이는 클라이언트에게 전달할 특정 필드들을 선별하고 구조화하는 데 있어 핵심적인 역할을 수행 (최종 출력 형태를 결정하는 만큼, 효율적인 전달과 활용을 위해 신중하게 구성해야 함)
    • $group: 데이터 처리 과정에서 데이터셋을 정제하고 축소한 후, 특정 기준에 따라 데이터를 체계적으로 그룹화하는 데 활용됨
    • $unwind: 배열 형태의 필드를 분리하여 요소별로 독립된 새로운 문서를 생성하는 데 사용되며 해당 연산자를 통해 배열 데이터를 개별 문서로 변환함으로써 더 상세한 분석과 처리가 가능해짐
    • $lookup: 서로 다른 컬렉션 간의 왼쪽 외부 조인을 수행하는 연산자이며 현재 집계 중인 컬렉션의 문서를 다른 컬렉션의 문서와 연결하는 데 사용됨
    • $geoNear: 지정된 위치를 기준으로 문서들을 거리순으로 정렬하는 데 사용되며 가장 가까운 위치부터 먼 위치 순으로 문서들을 배열하며, 이를 위해서는 해당 컬렉션에 지리 공간 정보가 포함된 필드와 그에 관한 지리 공간 인덱스가 반드시 구성되어 있어야 함 (해당 연산자는 반드시 집계 파이프라인의 첫 번째 단계에서만 사용할 수 있으며, 이는 지리 공간 데이터 처리의 특성상 불가피한 제약)
    • $redact: 문서에 저장된 메타데이터나 속성을 기반으로 문서의 접근 범위를 효과적으로 제한할 수 있게 해 주며 주로 조직의 데이터 접근 제어 정책을 구현하는 데 활용됨
    • $replaceWith: 입력 문서의 내용을 지정된 새로운 문서로 완전히 대체하는 데 사용되며 문서의 구조를 근본적으로 변경하고나 재구성할 수 있음; 특히 복잡한 중첩 구조를 단순화하거나 특정 하위 문서를 상위 수준으로 승격시키는 데 효과적


 

쿼리 기술

  • 데이터베이스 관리에 있어 고급 쿼리 기술의 활용은 시스템의 성능과 효율성을 결정짓는 핵심 요소
  • 효과적인 쿼리 작성은 단순히 데이터를 검색하는 것을 넘어, 시스템 자원을 최적화하고 신속한 데이터 분석을 가능케 함

 

1. 논리와 비교 연산자

  • 몽고DB의 쿼리 언어는 논리 연산자와 비교 연산자를 통해 데이터를 세밀하게 필터링하고 선택할 수 있는 기능을 제공함
    • $or: 지정된 여러 조건 중 하나라도 충족하는 문서를 검색하여 반환하는 논리 OR 연산을 수행하며 다양한 조건을 유연하게 조합하여 원하는 데이터를 효과적으로 찾아낼 수 있음
    • $and: 여러 조건을 모두 만족하는 문서를 검색하는 노리 AND 연산을 수행하며 몽고DB에서는 별도의 연산자를 지정하지 않을 경우 기본적으로 AND 연산을 수행하지만, 쿼리의 의도를 명확히 전달하기 위해 해당 연산자를 명시적으로 사용하는 경우가 많음
    • $not: 지정된 조건과 일치하지 않는 문서를 선별하는 부정 연산을 수행하며 원하지 않는 조건을 제외하거나, 특정 패턴에 부합하지 않는 데이터를 찾아내는 데 사용
    • $nor: 주어진 모든 조건을 만족하지 않는 문서를 찾아내는데 사용하며 여러 가지 배제 조건을 동시에 적용해야 할 때 특히 유용한 연산자
    • $in, $nin: 특정 필드의 값이 지정된 배열 내의 값들과 일치하거나 전혀 일치하지 않는 문서를 검색하는 데 사용하며 여러 가지 가능한 값 중 하나와 일치하는 문서를 효율적으로 찾아내야 할 때 매우 유용함
    • $eq: 데이터베이스에서 특정 필드의 값이 지정된 값과 정확히 일치하는 문서를 검색하는 데 사용됨
    • $ne: 데이터베이스에서 특정 필드의 값이 지정된 값과 일치하지 않는 문서를 검색하는 데 사용됨
    • $gt, $lt: 몽고DB에서 수치 기반의 데이터 필터링을 수행하는 데 사용되는 핵심적인 비교 연산자
    • $gte, $lte: 몽고DB에서 포괄적인 범위 검색을 수행하는 데 사용되는 비교 연산자


 

2. 배열 쿼리와 조작

  • 몽고DB의 배열 쿼리와 조작 기능은 문서 내 배열 데이터를 효과적으로 관리할 수 있게 해주는 중요한 도구
  • 특히 $elemMatch, $all과 같은 검색 연산자와 $push, $pull과 같은 수정 연사를 통해 배열 기반의 데이터 구조를 정밀하게 다룰 수 있음
  • 이러한 연산자들은 복잡한 배열 데이터를 다루는 데 핵심적인 역할을 수행함
    • $all: 몽고DB에서 배열 필드가 특정 요소들을 모두 포함하는 문서를 검색할 때 사용되며 여러 조건을 동시에 만족하는 배열 데이터를 찾아내는 데 매우 효과적인 도구
    • $elemMatch: 지정된 모든 쿼리 조건과 일치하는 요소가 하나 이상 있는 배열 필드가 포함된 문서를 조회
    • $size: 배열이 정확히 지정된 수의 요소를 포함하고 있는 문서를 조회
    • $push: 배열에 새로운 요소를 추가하는 기능을 수행
    • $pull: 배열에서 조건에 맞는 요소를 제거하는 기능을 수행
    • $addToSet: 배열 내 동일한 값이 없는 경우에만 새로운 요소를 추가하는 기능을 수행
    • $pop: 배열의 처음이나 끝에서 요소를 삭제할 때 사용하며 매개변수로 -1을 전달하면 배열의 첫 번째 요소가 삭제되고, 1을 전달하면 마지막 요소가 삭제됨


 

3. 배열 필드의 출력 제어 기법

  • 몽고DB에서 출력 제어 기법은 쿼리 결과에서 배열 필드의 반환 범위를 지정함
  • $, $elemMatch, $slice와 같은 연산자를 활용하면 필요한 데이터만 선별적으로 조회할 수 있어, 네트워크 대역폭 사용량과 처리 시간을 줄일 수 있으며 이를 통해 데이터베이스 작업의 효율성을 크게 높일 수 있음
    • $: 쿼리 조건에 부합하는 배열의 첫 번째 요소만을 결과로 반환
    • $elemMatch: 배열 요소에 관해 여러 조건을 동시에 적용할 수 있음; 적어도 하나의 배열 요소가 지정된 모든 조건을 충족해야 하며, 이는 특히 객체로 구성된 배열을 다룰 때 효과적
    • $slice: 배열에서 반환할 요소의 개수를 지정 가능


 

인덱스와 쿼리 최적화

  • 몽고DB의 인덱스는 쿼리 성능을 높이기 위한 핵심적인 데이터 구조
  • 인덱스가 없다면 몽고DB는 원하는 결과를 찾기 위해 컬렉션의 모든 문서를 검색해야 하는 반면 인덱스를 활용하면 검색 대상 문서의 수를 대폭 줄일 수 있어 쿼리 처리가 훨씬 효율적으로 이루어짐

 

1. 인덱스 사용의 장점

  • 몽고DB에서 인덱스의 장점은 다음과 같음
    • 성능 개선: 인덱스를 사용하면 데이터 검색 속도가 크게 향상됨
    • 시스템 부하 감소: 검색 속도가 향상되면서 시스템의 전반적인 부하가 줄어들고, 컴퓨팅 장원을 더욱 효율적으로 활용 가능
    • 정렬 작업 효율화: 인덱스를 통해 별도의 정렬 연산 없이도 원하는 순서로 결과를 얻을 수 있음
    • 고급 쿼리 지원: 위치 기반 검색이나 전문 검색과 같은 복잡한 쿼리도 특수 인덱스를 통해 효율적으로 처리 가능
    • 메모리 사용 최적화: 인덱스를 활용하면 필요한 데이터만 메모리에 올릴 수 있어, 대용량 데이터 셋도 효율적으로 처리 가능

 

  • 다만, 인덱스는 쿼리 성능을 개선하지만 추가 저장 공간을 차지하므로, 인덱스를 생성할 필드를 신중하게 선택해야 함
  • 또한 인덱스는 읽기 성능은 향상하지만, 데이터 수정 시 인덱스도 함께 갱신해야 하므로 쓰기 작업이 다소 느려질 수 있음

 

2. 인덱스 종류

  • 몽고DB는 다양한 종류의 인덱스를 제공하여 각각의 쿼리 패턴에 최적화된 성능을 제공함
  • 적절한 인덱스를 선택하면 쿼리 처리 속도를 현저히 개선할 수 있음

 

가. 단일 필드 인덱스

  • 단일 필드를 대상으로 인덱스를 생성하는 가장 기본적인 인덱스 유형
  • 특정 필드를 기준으로 데이터를 검색할 때 성능을 크게 향상함


 

나. 복합 인덱스

  • 여러 필드를 조합한 복합 인덱스를 생성하여 다중 조건 검색의 성능을 최적화할 수 있음
  • 복수의 필드값을 기준으로 데이터를 검색하거나 정렬할 때 활용하는 인덱스


 

다. 다중키 인덱스

  • 배열 형태의 필드에 인덱스를 생성하면 해당 배열의 모든 요소가 자동으로 인덱싱 되고 이를 다중 키 인덱스라고 지칭
  • 배열 내부의 개별 요소에 관한 빠른 검색이 가능해짐
  • 여러 값을 포함하는 배열 필드에서 특정 값을 검색할 때 성능을 크게 향상


 

라. 복합 다중키 인덱스

  • 복합 인덱스를 생성할 때 배열 필드를 포함할 수 있음
  • 몽고DB는 배열의 각 요소를 자동으로 인덱싱하지만, 복합 다중 키 인덱스에는 중요한 제약 사항이 있음
    • 하나의 복합 인덱스 내에서는 오직 하나의 배열 필드만 인덱싱 가능

 

  • 여러 필드의 값을 기준으로 데이터를 정렬하거나 필터링해야 할 때 해당 인덱스가 효과적
    • 이때 하나의 필드는 배열 형태일 수 있어, 제품의 카테고리와 가격대를 동시에 검색하는 등 복잡한 검색 조건을 처리할 수 있음
    • 특히 계층구조를 가진 데이터나 다양한 속성을 포함하는 문서를 다룰 때 큰 성능 향상을 기대할 수 있음


 

마. 텍스트 인덱스

  • 텍스트 검색 기능을 지원하는 인덱스로 문자열 필드나 문자열 배열 필드에 관해 전문 검색을 가능하게 함
  • 여러 텍스트 필드를 통합 검색할 때 특히 유용함
    • 각 필드에 가중치를 부여할 수 있어 검색 결과의 우선순위를 조정할 수 있음
    • i.g. 게시물 검색 시 제목 필드에는 높은 가중치를, 본문 필드에는 낮은 가중치를 할당하여 제목에서 일치하는 결과를 상위에 표시할 수 있음


 

바. 와일드카드 인덱스

  • 필드와 위치와 상관없이 생성되는 와일드카드 인덱스는 동적으로 변화하는 문서 구조에 대응하기 위한 유연한 인덱싱 방식
  • 특히 문서마다 필드 구조가 다르거나, 시간에 따라 스키마가 변경되는 데이터베이스에 효과적
  • 두 가지 주요 시나리오에서 특히 효과적
    • 중첩된 문서 구조에서 정확한 필드 경로를 모르는 상황에서도 인덱싱 가능
    • 문서의 모든 필드를 자동으로 인덱싱해야 할 때 이상적인 방법 제공


 

사. TTL 인덱스

  • 문서의 자동 삭제 기능을 제공
  • 특정 시간이 지나면 해당 문서를 데이터베이스에서 자동으로 제거하며, 이는 세션 데이터나 임시 로그와 같은 일시적인 정보를 관리할 때 특히 유용
  • 해당 인덱스를 활용하면 데이터의 수명 주기를 자동으로 관리할 수 있어, 시스템 관리자의 수동 개입 없이도 저장 공간을 효율적으로 유지할 수 있음


 

아. 고유 인덱스

  • 특정 필드의 값이 컬렉션 내에서 중복되지 않도록 보장
  • 사용자 이메일 주소나 제품 코드와 같이 고유성이 필요한 필드에 해당 인덱스를 적용하면, 몽고DB는 중복된 값이 삽입되는 것을 자동으로 방지함


 

자. 부분 인덱스

  • 부분 인덱스는 특정 조건을 만족하는 문서만을 선택적으로 인덱싱하는 기능을 제공하며 실제로 검색이 필요한 데이터만 인덱싱함으로써 인덱스의 크기를 최적화하고 성능을 향상함
    • i.g. 활성 상태인 사용자 계정만 빠른 검색이 필요하거나, 최근 3개월 내의 거래 데이터만 자주 조회되는 경우에 유용하게 활용 가능


 

몽고DB 위치 기반 데이터 처리

  • 몽고DB의 지리 공간 기능은 위치 기반 서비스를 효과적으로 구현할 수 있도록 설계됨
  • 특히 인덱스와 연산자를 통해 지리적 데이터를 효율적으로 처리할 수 있어, 지도 서비스나 위치 검색과 같은 다양한 서비스 개발에 활용됨
  • 좌표는 위치 데이터를 표현하는 기본적인 방식으로, 경도와 위도 값으로 구성된 배열을 사용하며 이러한 좌표 데이터를 효율적으로 검색하기 위해 몽고DB는 2d 인덱스를 제공함


 

1. GeoJSON 개체

  • GeoJSON 객체는 세 가지 유형이 있음
    • 점 (Point): 경도와 위도 좌표로 공간상의 한 지점을 나타냄
    • 선 (LineString): 두 개 이상의 점들이 연결되어 선을 형성함
    • 다각형 (Polygon): 점들이 연결되어 닫힌 고리를 만들며, 이는 특정 영역을 정의함

 

2. 위치 기반 인덱스

  • 위치 기반 인덱스는 몽고DB에서 제공하는 특수 데이터 구조이며 공간 정보를 효율적으로 처리하여 위치 기반 검색의 성능을 크게 향상함
    • 2d 인덱스: 2d 인덱스는 2차원 평면에서의 위치 데이터를 효율적으로 처리하기 위해 설계되었으며 주로 위도와 경도로 구성된 자표 데이터를 다룰 때 사용됨
    • 2dsphere 인덱스: 몽고DB에서 지구 표면상의 위치 데이털르 처리하기 위해 특별히 설계된 인덱스로 특정 지역 내 위치 검색, 주변 지역 탐색, 정확한 위치 매칭 등 다양한 공간 검색이 가능함

 

3. 위치 기반 연산자

  • 몽고DB의 위치 기반 연산자는 공간 데이터를 효과적으로 분석하고 검색하기 위한 특별한 쿼리 도구
  • 이러한 연산자를 활용하면 위치 데이터를 기반으로 한 다양한 검색과 분석이 가능해짐
    • $near: 지정된 위치를 중심으로 가까운 순서대로 결과를 정렬하여 반환하며 사용자 주변의 음식점이나 편의시설을 검색하는 등 근접 위치 검색에 특히 유용함
    • $nearSphere: 지구 표면을 기준으로 특정 위치로부터 가까운 지점들을 검색하며 실제 지구의 곡률을 고려하여 거리를 계산하므로 정확한 위치 기반 검색이 가능함
    • $geoWithin: 지정된 영역 안에 완전히 포함되는 위치 데이터를 검색하며 해당 연산자를 사용하면 특정 구역이나 경계 내의 모든 위치를 효율적으로 찾을 수 있음
    • $geoIntersects: 지정된 영역과 겹치거나 교차하는 모든 위치 데이터를 검색하며 도로망과 교차하는 건물 찾기, 특정 경로와 만나는 관심 지점 검색 등 복잡한 공간 분석에 활용됨
    • $maxDistance: $near, $nearSphere를 사용하는 위치 기반 검색에서 검색 범위를 제한하는 데 사용됨; 해당 연산자를 활용하면 배달 가능 거리 설정, 도보 가능 거리 내 시설 검색 등 실용적인 위치 기반 서비를 구현할 수 있음


 

참고

마스터링 몽고DB 7.0

반응형

'DB > 마스터링 몽고DB 7.0' 카테고리의 다른 글

[6장] 스키마 설계와 데이터 모델링  (1) 2025.07.11
[5장] CRUD 작업과 기본 쿼리  (1) 2025.07.11
[4장] 몽고DB 연결  (0) 2025.07.11
[3장] 개발자 도구  (0) 2025.07.10
[2장] 몽고DB 아키텍처  (0) 2025.07.05