온디맨드 구체화된 뷰는 디스크에 저장되고 디스크에서 읽히는 미리 계산된 집계 파이프라인 결과입니다. 온디맨드 구체화된 뷰는 일반적으로 $merge 또는 $out 단계의 결과물입니다.
표준 뷰와 비교
MongoDB는 표준 뷰와 온디맨드 구체화된 뷰의 두 가지 뷰 유형을 제공합니다. 두 뷰 유형 모두 집계 파이프라인에서 결과를 반환합니다.
표준 뷰는 뷰를 읽을 때 계산되며 디스크에 저장되지 않습니다.
온디맨드 구체화된 뷰는 디스크에 저장되고 디스크에서 읽혀집니다.
$merge또는$out단계를 사용하여 저장된 데이터를 업데이트합니다.
Indexes
표준 뷰는 기본 컬렉션의 인덱스를 사용합니다. 따라서 표준 뷰에서 직접 인덱스를 생성, 제거 또는 다시 작성할 수 없으며 뷰에서 인덱스 목록을 가져올 수 없습니다.
인덱스가 디스크에 저장되므로 온디맨드 구체화된 뷰에서 직접 인덱스를 생성할 수 있습니다.
성능
온디맨드 구체화된 뷰는 쿼리의 일부로 계산되지 않고 디스크에서 읽기 때문에 표준 뷰보다 읽기 성능이 뛰어납니다. 파이프라인의 복잡성과 집계되는 데이터의 크기가 커질수록 이러한 성능 이점이 더 커집니다.
MongoDB Atlas UI에서 구체화된 뷰 만들기
이 섹션의 예시에서는 샘플 교육 데이터세트를 사용합니다. MongoDB Atlas 배포에 샘플 데이터세트를 로드하는 방법을 알아보려면 샘플 데이터 로드를 참조하세요.
MongoDB Atlas UI에서 구체화된 뷰를 만들려면 다음 단계를 따르세요.
MongoDB Atlas UI 에서 프로젝트 의 Clusters 페이지로 이동합니다.
아직 표시되지 않은 경우 탐색 표시줄의 Organizations 메뉴에서 원하는 프로젝트가 포함된 조직을 선택합니다.
아직 표시되지 않은 경우 내비게이션 바의 Projects 메뉴에서 프로젝트를 선택합니다.
사이드바에서 Database 제목 아래의 Clusters를 클릭합니다.
Clusters(클러스터) 페이지가 표시됩니다.
Aggregation 탭클릭합니다.
Select 드롭다운 메뉴에서 집계 단계를 선택합니다.
뷰로 저장하려는 데이터를 집계 단계에서 변환합니다. 사용 가능한 집계 단계에 대해 자세히 알아보려면 집계 단계를 참조하세요.
이 예시에서는 $set 단계가 있는 새 필드를 추가합니다.
Select 드롭다운 메뉴에서
$set를 선택합니다.집계 파이프라인 편집기에 다음
score구문을scores추가하여grades컬렉션 내 배열의 모든 값에 대한 평균 점수를 만듭니다:{ averageScore: { $avg: "$scores.score" } } MongoDB Atlas는 각 문서에
averageScore값을 추가합니다.
$out 단계 추가
Select 드롭다운 메뉴에서
$out단계를 선택합니다.파이프라인 결과를
sample_training데이터베이스의myView컬렉션에 쓰려면 집계 파이프라인에 다음 구문을 추가하세요.'myView' Save Documents를 클릭합니다.
$out 단계에서는 집계 파이프라인의 결과를 특정 컬렉션에 기록하여 뷰를 만듭니다. 자세한 내용은 $out을 참조하세요.
컬렉션 목록을 새로고침하여 myView 컬렉션을 확인합니다.
MongoDB Atlas UI에서 myView 컬렉션을 쿼리하는 방법을 알아보려면 MongoDB Atlas 설명서에서 문서 조회, 필터링 및 정렬을 참조하세요.
예시
이 예시에서는 sample_mflix 데이터 세트의 movies 컬렉션을 사용합니다. 샘플 데이터를 로드하는 방법을 알아보려면 샘플 데이터 로드를 참조하세요.
1. 온디맨드 구체화된 뷰 정의하기
다음 updateMovieStats 함수는 연도별 영화의 수와 평균 IMDb 평점을 포함하는 movieYearStats 구체화된 뷰를 정의합니다. 함수는 startYear 매개변수를 허용하여 해당 연도 이후에 출시된 영화의 통계를 업데이트합니다.
updateMovieStats = function(startYear) { db.movies.aggregate( [ { $match: { year: { $gte: startYear } } }, { $group: { _id: "$year", movieCount: { $sum: 1 }, avgRating: { $avg: "$imdb.rating" } } }, { $merge: { into: "movieYearStats", whenMatched: "replace" } } ] ); };
$match단계는year값이startYear보다 크거나 같은 영화만 처리하도록 영화를 필터링합니다.$group단계는year별로 영화를 그룹화합니다. 이 단계에서 출력되는 문서의 형식은 다음과 같습니다.{ "_id" : <year>, "movieCount" : <num>, "avgRating" : <num> } $merge단계는 출력을movieYearStats컬렉션에 씁니다.이 단계는
_id필드에 대해 일치 하고 각 집계 결과가 기존 문서와 일치 하는지 확인합니다.일치하는 항목이 있는 경우 (즉, 같은 연도의 문서 컬렉션에 이미 존재하는 경우) 단계에서 기존 문서를 집계 결과의 문서로 대체합니다.
일치하는 항목이 없는 경우 단계는 집계 결과의 문서를 컬렉션에 삽입합니다(일치하지 않은 경우의 기본 동작).
2. 초기 실행 수행
초기 실행을 위해 시작 연도를 전달하여 movieYearStats 에 해당 연도 이후의 데이터를 채우십시오.
updateMovieStats(2015);
초기 실행 후 db.movieYearStats.find().sort( { _id: 1 } ) 은(는) 다음과 같은 문서를 반환합니다.
{ "_id" : 2015, "movieCount" : <num>, "avgRating" : <num> } { "_id" : 2016, "movieCount" : <num>, "avgRating" : <num> } { "_id" : 2017, "movieCount" : <num>, "avgRating" : <num> }
3. 구체화된 뷰 새로 고침
2016의 movies 컬렉션에 새 영화가 추가된다고 가정합니다.
db.movies.insertOne( { title: "Grove Test Movie", year: 2016, imdb: { rating: 7.5, votes: 500 } } )
2016 이후에 대한 movieYearStats 를 새로 고침하려면 startYear 가 2016인 함수를 실행하세요.
updateMovieStats(2016);
업데이트된 movieYearStats 에는 movies 컬렉션의 새 영화가 반영됩니다. db.movieYearStats.find().sort( { _id: 1 } ) 는 다음을 반환합니다.
{ "_id" : 2015, "movieCount" : <num>, "avgRating" : <num> } { "_id" : 2016, "movieCount" : <num>, "avgRating" : <num> } { "_id" : 2017, "movieCount" : <num>, "avgRating" : <num> }
추가 정보
$merge 단계:
동일하거나 다른 데이터베이스의 컬렉션으로 출력할 수 있습니다.
출력 컬렉션이 아직 존재하지 않는 경우 새 컬렉션을 생성합니다.
결과(새 문서 삽입, 문서 병합, 문서 교체, 기존 문서 유지, 작업 실패, 사용자 지정 업데이트 파이프라인으로 문서 처리)를 기존 컬렉션에 통합할 수 있습니다.
샤드된 컬렉션으로 출력할 수 있습니다. 입력 컬렉션도 샤딩할 수 있습니다.
다음 사항에 대해서는 $merge를 참조하세요.