Docs Menu
Docs Home
/
MongoDB 매뉴얼
/ / /

뷰 만들기 및 쿼리

이 페이지의 내용

  • db.createCollection() 구문
  • db.createView() 구문
  • 제한 사항
  • 지원되지 않는 작업
  • 예시
  • 컬렉션 채우기
  • db.createView()를 사용하여 뷰 만들기
  • db.createCollection()을 사용하여 뷰 만들기
  • 행동
  • 집계 최적화
  • 리소스 잠금

뷰를 만들려면 다음 방법 중 하나를 사용합니다.

MongoDB Atlas UI에서 뷰를 만들려면 구체화된 뷰를 사용해야 합니다. 자세히 알아보려면 MongoDB Atlas UI에서 구체화된 뷰 만들기를 참조하세요.

중요

컬렉션 목록 출력에 뷰 이름이 포함됨

db.getCollectionInfos()db.getCollectionNames() 같이 컬렉션을 나열하는 연산은 출력에 뷰를 포함합니다.

뷰 정의는 공개입니다. 즉, 뷰에 대한 db.getCollectionInfos()explain 작업에는 뷰를 정의하는 파이프라인이 포함됩니다. 따라서 뷰 정의에 민감한 필드와 값을 직접 참조하지 않는 것이 좋습니다.

db.createCollection(
"<viewName>",
{
"viewOn" : "<source>",
"pipeline" : [<pipeline>],
"collation" : { <collation> }
}
)
db.createView(
"<viewName>",
"<source>",
[<pipeline>],
{
"collation" : { <collation> }
}
)
  • 원본 컬렉션과 동일한 데이터베이스에 뷰를 만들어야 합니다.

  • 보기 정의 pipeline에는 $out 또는 $merge 단계를 포함할 수 없습니다. 이 제한은 $lookup 단계 또는 $facet 단계에서 사용되는 파이프라인과 같은 임베디드 파이프라인에도 적용됩니다.

  • 뷰를 만든 후에는 이름을 변경할 수 없습니다.

일부 작업은 뷰에서 사용할 수 없습니다.

자세한 내용은 뷰에 대해 지원되는 작업을 참조하세요.

이 예제에서는 학생 데이터로 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()를 사용하여 1학년 학생으로 제한되는 뷰를 만듭니다.

db.createView(
"firstYears",
"students",
[ { $match: { year: 1 } } ]
)

예시:

  • firstYears 새 뷰의 이름입니다.

  • students 뷰의 기반이 되는 컬렉션입니다.

  • $matchstudents 컬렉션의 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 }
]

참고

프로젝션 제한 사항

뷰에 대한 find() 작업은 다음 프로젝션 연산자를 지원하지 않습니다.

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.createView() 은(는) 작업 기간 동안 지정된 컬렉션 또는 뷰에 대한 배타 락을 얻습니다. 컬렉션에 대한 모든 후속 작업은 db.createView()이(가) 잠금을 해제할 때까지 기다려야 합니다. db.createView() 은(는) 일반적으로 짧은 시간 동안 이 잠금을 유지합니다.

뷰를 만들려면 데이터베이스의 system.views 컬렉션에 대한 추가 배타 락을 얻어야 합니다. 이 잠금은 명령이 완료될 때까지 데이터베이스의 뷰 생성 또는 수정을 차단합니다.

돌아가기

조회수