뷰 만들기 및 쿼리
이 페이지의 내용
뷰를 만들려면 다음 방법 중 하나를 사용합니다.
다음을 사용하세요.
db.createCollection()
다음을 사용하세요.
db.createView()
MongoDB Atlas UI에서 뷰를 만들려면 구체화된 뷰를 사용해야 합니다. 자세히 알아보려면 MongoDB Atlas UI에서 구체화된 뷰 만들기를 참조하세요.
중요
컬렉션 목록 출력에 뷰 이름이 포함됨
db.getCollectionInfos()
및 db.getCollectionNames()
같이 컬렉션을 나열하는 연산은 출력에 뷰를 포함합니다.
뷰 정의는 공개입니다. 즉, 뷰에 대한 db.getCollectionInfos()
및 explain
작업에는 뷰를 정의하는 파이프라인이 포함됩니다. 따라서 뷰 정의에 민감한 필드와 값을 직접 참조하지 않는 것이 좋습니다.
db.createCollection()
구문
db.createCollection( "<viewName>", { "viewOn" : "<source>", "pipeline" : [<pipeline>], "collation" : { <collation> } } )
db.createView()
구문
db.createView( "<viewName>", "<source>", [<pipeline>], { "collation" : { <collation> } } )
제한 사항
원본 컬렉션과 동일한 데이터베이스에 뷰를 만들어야 합니다.
보기 정의
pipeline
에는$out
또는$merge
단계를 포함할 수 없습니다. 이 제한은$lookup
단계 또는$facet
단계에서 사용되는 파이프라인과 같은 임베디드 파이프라인에도 적용됩니다.뷰를 만든 후에는 이름을 변경할 수 없습니다.
지원되지 않는 작업
일부 작업은 뷰에서 사용할 수 없습니다.
집계에서
$text
는 첫 번째 단계에만 유효하므로$text
연산자를 사용할 수 없습니다.뷰 이름 변경.
자세한 내용은 뷰에 대해 지원되는 작업을 참조하세요.
예시
이 예제에서는 학생 데이터로 collection을 채우고 데이터를 쿼리 뷰를 만듭니다.
컬렉션 채우기
이 예시에 사용할 students
컬렉션을 만듭니다.
db.students.insertMany( [ { sID: 22001, name: "Alex", year: 1, score: 4.0 }, { sID: 21001, name: "bernie", year: 2, score: 3.7 }, { sID: 20010, name: "Chris", year: 3, score: 2.5 }, { sID: 22021, name: "Drew", year: 1, score: 3.2 }, { sID: 17301, name: "harley", year: 6, score: 3.1 }, { sID: 21022, name: "Farmer", year: 1, score: 2.2 }, { sID: 20020, name: "george", year: 3, score: 2.8 }, { sID: 18020, name: "Harley", year: 5, score: 2.8 }, ] )
db.createView()를 사용하여 뷰 만들기
db.createView()
를 사용하여 1학년 학생으로 제한되는 뷰를 만듭니다.
db.createView( "firstYears", "students", [ { $match: { year: 1 } } ] )
예시:
firstYears
새 뷰의 이름입니다.students
뷰의 기반이 되는 컬렉션입니다.$match
는students
컬렉션의 1학년 학생과 일치하는 집계 표현식입니다.
뷰 쿼리
이 예에서는 뷰를 쿼리합니다.
db.firstYears.find({}, { _id: 0 } )
다음 출력에는 1학년 학생에 대한 데이터가 있는 문서만 포함되어 있습니다. { _id: 0 }
프로젝션은 출력 디스플레이에 _id
필드를 표시하지 않습니다.
[ { sID: 22001, name: 'Alex', year: 1, score: 4 }, { sID: 22021, name: 'Drew', year: 1, score: 3.2 }, { sID: 21022, name: 'Farmer', year: 1, score: 2.2 } ]
db.createCollection()을 사용하여 뷰 만들기
db.createCollection()
메서드를 사용하면 특정 옵션이 있는 컬렉션 또는 뷰를 만들 수 있습니다.
다음 예에서는 graduateStudents
뷰를 만듭니다. 뷰에는 $match
단계에서 선택한 문서만 포함되어 있습니다. 선택적 데이터 정렬 설정에 따라 정렬 순서가 결정됩니다.
db.createCollection( "graduateStudents", { viewOn: "students", pipeline: [ { $match: { $expr: { $gt: [ "$year", 4 ] } } } ], collation: { locale: "en", caseFirst: "upper" } } )
참고
데이터 정렬 동작
뷰를 만들 때 뷰의 기본 데이터 정렬을 지정할 수 있습니다. 데이터 정렬이 지정되지 않은 경우, 뷰의 기본 데이터 정렬은 "simple" 이진 비교 데이터 정렬기입니다. 즉, 뷰는 컬렉션의 기본 데이터 정렬을 상속하지 않습니다.
뷰의 문자열 비교에서는 뷰의 기본 데이터 정렬을 사용합니다. 뷰의 기본 데이터 정렬을 변경하거나 재정의하려는 작업은 오류를 반환하며 실패합니다.
다른 보기에서 보기를 만드는 경우 원본 보기의 데이터 정렬과 다른 데이터 정렬을 지정할 수 없습니다.
$lookup
또는$graphLookup
과 같이 여러 뷰를 포함하는 집계를 수행하는 경우 뷰의 데이터 정렬이 동일해야 합니다.
뷰 쿼리
다음 예시에서는 보기를 쿼리합니다. $unset
단계에서는 명확성을 위해 출력에서 _id
필드를 제거합니다.
db.graduateStudents.aggregate( [ { $sort: { name: 1 } }, { $unset: [ "_id" ] } ] )
출력이 정렬될 때 $sort
단계에서는 데이터 정렬 순서를 사용하여 대문자를 소문자보다 먼저 정렬합니다.
[ { sID: 18020, name: 'Harley', year: 5, score: 2.8 }, { sID: 17301, name: 'harley', year: 6, score: 3.1 } ]
행동
다음 섹션에서는 뷰 만들기 및 쿼리의 동작에 대해 설명합니다.
집계 최적화
뷰를 쿼리하는 경우:
db.collection.find()
에 대한 쿼리filter
,projection
,sort
,skip
,limit
및 기타 작업은 해당 집계 파이프라인 단계로변환됩니다.MongoDB는 클라이언트 쿼리를 기본 파이프라인에 추가하고 결합된 파이프라인의 결과를 클라이언트에 반환합니다. MongoDB는 결합된 파이프라인에 집계 파이프라인 최적화 를 적용할 수 있습니다.
집계 파이프라인 옵티마이저는 성능을 개선하기 위해 뷰 집계 파이프라인 단계를 재구성합니다. 최적화로 인해 쿼리 결과가 변경되지는 않습니다.
리소스 잠금
db.createView()
은(는) 작업 기간 동안 지정된 컬렉션 또는 뷰에 대한 배타 락을 얻습니다. 컬렉션에 대한 모든 후속 작업은 db.createView()
이(가) 잠금을 해제할 때까지 기다려야 합니다. db.createView()
은(는) 일반적으로 짧은 시간 동안 이 잠금을 유지합니다.
뷰를 만들려면 데이터베이스의 system.views
컬렉션에 대한 추가 배타 락을 얻어야 합니다. 이 잠금은 명령이 완료될 때까지 데이터베이스의 뷰 생성 또는 수정을 차단합니다.