MongoDB 뷰

MongoDB 뷰 (Views)

집계 파이프라인의 결과를 마치 테이블처럼 반복해서 조회하고 싶을 때가 있죠? 그럴 때 쓰는 게 MongoDB의 뷰예요. 뷰는 다른 컬렉션이나 뷰에 대한 집계 파이프라인으로 내용이 정의되는 읽기 전용 쿼리 가능 객체예요. 내용을 디스크에 저장하지 않고, 클라이언트가 쿼리할 때 그때그때 계산돼요.

출처: Views (공식 문서)

본문

어떤 상황에 쓸까요

뷰는 이런 경우에 유용해요.

  • 직원 데이터 컬렉션에 뷰를 만들어 개인 식별 정보(PII)를 제외한 모습을 제공할 수 있어요.
  • 센서 데이터 컬렉션에 계산 필드와 메트릭을 추가한 뷰를 만들 수 있어요.
  • 재고와 주문 이력 두 컬렉션을 조인하는 뷰를 만들면, 애플리케이션이 내부 파이프라인을 관리하거나 이해하지 않고도 뷰만 쿼리할 수 있어요.

표준 뷰와 온디맨드 구체화 뷰

MongoDB는 두 종류의 뷰를 제공해요. 둘 다 집계 파이프라인의 결과를 반환해요.

  • 표준 뷰(Standard Views) — 뷰를 읽는 시점에 계산되고 디스크에 저장되지 않아요.
  • 온디맨드 구체화 뷰(On-Demand Materialized Views) — 디스크에 저장되고 디스크에서 읽어요. $merge 또는 $out 스테이지로 저장 데이터를 갱신해요.

$merge를 쓸 때는 체인지 스트림으로 구체화 뷰의 변경을 감시할 수 있지만, $out을 쓸 때는 할 수 없어요.

인덱스

표준 뷰는 기저 컬렉션의 인덱스를 사용해요. 그래서 표준 뷰에 직접 일반 인덱스를 만들거나, 드롭하거나, 재구성하거나, 인덱스 목록을 조회할 수 없어요. 반면 온디맨드 구체화 뷰에는 인덱스를 직접 만들 수 있는데, MongoDB가 그 인덱스를 디스크에 저장하기 때문이에요.

성능

온디맨드 구체화 뷰는 쿼리의 일부로 계산되는 대신 디스크에서 읽기 때문에 표준 뷰보다 읽기 성능이 좋아요. 이 이점은 파이프라인이 복잡하고 집계하는 데이터가 클수록 커져요.

동작 방식

  • 읽기 전용 — 뷰는 읽기 전용이에요. 뷰에 쓰기 연산을 하면 오류를 반환해요.
  • 스냅샷 격리 — 뷰는 컬렉션 변경의 타임스탬프를 유지하지 않아서, 특정 시점(point-in-time)이나 스냅샷 읽기 격리를 지원하지 않아요.
  • 뷰 파이프라인 — 뷰의 기저 집계 파이프라인은 블로킹 정렬과 블로킹 그룹 연산에 대한 100MB 메모리 제한을 받아요. 100MB보다 많은 메모리가 필요한 파이프라인 스테이지는 기본적으로 임시 파일을 디스크에 써요. 이 임시 파일은 파이프라인 실행 동안만 존재하며 인스턴스의 저장 공간에 영향을 줄 수 있어요.

개별 findaggregate 명령에서 allowDiskUse: trueallowDiskUse: falseallowDiskUseByDefault 파라미터를 덮어쓸 수 있어요.

시계열 컬렉션은 '쓰기 가능한 비구체화 뷰'예요. 뷰의 제한이 시계열 컬렉션에도 그대로 적용돼요.

접근 제어

인증을 강제하는 배포에서는 뷰를 만들려면 뷰가 생성되는 데이터베이스에 createCollection 권한이 필요해요. 그리고 뷰를 만들려는 네임스페이스에 find 권한이 있다면, 뷰가 만들어지는 원본 컬렉션·뷰에도 find 권한이 있어야 해요.

뷰를 쿼리하려면 뷰 네임스페이스에 find 권한이 필요해요. 뷰 파이프라인에 참조된 원본 컬렉션이나 네임스페이스에는 find가 필요 없어요. 데이터베이스에 내장 readWrite 역할을 가진 사용자는 위 연산에 필요한 권한을 모두 갖고 있어요.

더 알아보기