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

db.createView()

이 페이지의 내용

  • 호환성
  • 구문
  • 행동
  • 액세스 제어
  • 예시
db.createView()

참고

다음 페이지에서는 뷰에 대해 설명합니다. 온디맨드 구체화된 뷰에 대한 설명은 $merge 를 대신 참조하세요.

지정된 집계 파이프라인을 소스 collection 또는 뷰에 적용한 결과로 를 생성합니다. 뷰는 읽기 전용 collection 역할을 하며 읽기 작업 중에 온디맨드로 계산됩니다. 소스 collection과 동일한 데이터베이스에 뷰를 생성해야 합니다. MongoDB는 집계 파이프라인의 일부로 뷰에 대한 읽기 작업을 실행합니다.

뷰 정의 pipeline 에는 $out 또는 $merge 단계를 포함할 수 없습니다. 뷰 정의에 중첩된 파이프라인이 포함된 경우(예: 뷰 정의에 $lookup 또는 $facet 단계가 포함된 경우) 이 제한은 중첩된 파이프라인에도 적용됩니다.

이 메서드는 다음 환경에서 호스팅되는 배포에서 사용할 수 있습니다.

  • MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스

참고

이 명령은 모든 MongoDB Atlas 클러스터에서 지원됩니다. 모든 명령에 대한 Atlas 지원에 대한 자세한 내용은 지원되지 않는 명령을 참조하세요.

db.createView 의 구문은 다음과 같습니다:

db.createView(<view>, <source>, <pipeline>, <options>)

이 메서드는 다음 매개 변수를 허용합니다:

Parameter
유형
설명
view
문자열
만들려는 뷰의 이름입니다.
source
문자열
뷰를 생성할 소스 컬렉션 또는 뷰의 이름입니다. 이 이름은 컬렉션 또는 뷰의 전체 네임스페이스가 아니며, 즉 데이터베이스 이름을 포함하지 않고 만들려는 뷰와 동일한 데이터베이스를 의미합니다. 소스 컬렉션과 동일한 데이터베이스에 뷰를 생성해야 합니다.
pipeline
배열

집계 파이프라인 단계로 구성된 배열입니다. db.createView()는 지정된 pipelinesource 컬렉션 또는 뷰에 적용하여 뷰를 생성합니다.

뷰 정의 pipeline 에는 $out 또는 $merge 단계를 포함할 수 없습니다. 뷰 정의에 중첩된 파이프라인이 포함된 경우(예: 뷰 정의에 $lookup 또는 $facet 단계가 포함된 경우) 이 제한은 중첩된 파이프라인에도 적용됩니다.

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

options
문서
선택 사항. 메서드에 대한 추가 옵션입니다.

옵션 문서 에는 다음과 같은 옵션 필드 가 포함되어 있습니다.

필드
유형
설명
collation
문서

선택 사항입니다. 뷰의 기본 데이터 정렬을 지정합니다.

데이터 정렬을 사용하면 대소문자 및 악센트 표시 규칙과 같은 문자열 비교에 대한 언어별 규칙을 지정할 수 있습니다.

기본 source가 컬렉션인 경우 뷰는 컬렉션의 데이터 정렬 설정을 상속하지 않습니다.

데이터 정렬이 지정되지 않은 경우, 뷰의 기본 데이터 정렬은 'simple' 이진 비교 데이터 정렬기입니다.

기본 source가 다른 뷰인 경우 뷰에서 동일한 데이터 정렬 설정을 지정해야 합니다.

데이터 정렬 옵션의 구문은 다음과 같습니다:

collation: {
locale: <string>,
caseLevel: <boolean>,
caseFirst: <string>,
strength: <int>,
numericOrdering: <boolean>,
alternate: <string>,
maxVariable: <string>,
backwards: <boolean>
}

데이터 정렬을 지정할 때 locale 필드는 필수이고, 다른 데이터 정렬 필드는 모두 선택 사항입니다. 필드에 대한 설명은 데이터 정렬 문서를 참조하세요.

버전 3.4에 새로 추가되었습니다.

db.createView() 메서드는 다음 create 명령 작업을 래핑합니다.

db.runCommand( { create: <view>, viewOn: <source>, pipeline: <pipeline>, collation: <collation> } )

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

중요

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

뷰를 제거하려면 뷰에서 drop() 메서드를 사용합니다.

뷰는 다음과 같은 동작을 나타냅니다.

뷰는 읽기 전용입니다. 뷰에 대한 쓰기 작업에 오류가 발생합니다.

뷰를 지원할 수 있는 읽기 작업은 다음과 같습니다.

  • 뷰는 기본 collection의 인덱스를 사용합니다.

  • 인덱스는 기본 collection에 있으므로 뷰에서 직접 인덱스를 생성, 삭제 또는 다시 작성할 수 없으며 뷰에서 인덱스 목록을 가져올 수 없습니다.

  • MongoDB 4.4부터는 뷰에서 $natural find 명령을 실행할 때 정렬을 지정할 수 있습니다. 이전 버전의 MongoDB는 뷰에서 $natural 정렬을 지원하지 않습니다.

  • 뷰의 기본 집계 파이프라인에는 블로킹 정렬 및 블로킹 그룹 작업에 대한 100메가바이트 메모리 제한이 적용됩니다. MongoDB 4.4부터는 뷰에서 allowDiskUse: true 와 함께 find 명령을 실행하여 MongoDB가 임시 파일을 사용하여 정렬 및 그룹 작업을 차단하도록 허용할 수 있습니다.

    MongoDB 4.4 이전에는 aggregate 명령만 allowDiskUse 옵션을 허용했습니다.

    다음도 참조하세요.

    블로킹 정렬 작업 메모리 제한에 대한 자세한 내용은 정렬 작업을 참조하세요.

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

의 이름은 바꿀 수 없습니다.

  • 뷰는 읽기 작업 중에 온디맨드로 계산되며, MongoDB는 기본 집계 파이프라인의 일부로 뷰에 대한 읽기 작업을 실행합니다. 따라서 뷰는 다음과 같은 작업을 지원하지 않습니다.

  • 뷰를 만드는 데 사용된 집계 파이프라인이 _id 필드를 억제하는 경우 뷰의 문서에 _id 필드가 없습니다.

뷰를 쿼리하면 다음이 수행됩니다.

뷰의 기본 collection이 샤드된 경우 뷰도 샤드된 것으로 간주됩니다. 따라서 $lookup$graphLookup 연산의 from 필드에 대해 샤드 뷰를 지정할 수 없습니다.

  • 뷰를 만들 때 뷰의 기본 데이터 정렬을 지정할 수 있습니다. 데이터 정렬이 지정되지 않은 경우, 뷰의 기본 데이터 정렬은 "simple" 이진 비교 데이터 정렬기입니다. 즉, 뷰는 컬렉션의 기본 데이터 정렬을 상속하지 않습니다.

  • 뷰의 문자열 비교에서는 뷰의 기본 데이터 정렬을 사용합니다. 뷰의 기본 데이터 정렬을 변경하거나 재정의하려는 작업은 오류를 반환하며 실패합니다.

  • 다른 보기에서 보기를 만드는 경우 원본 보기의 데이터 정렬과 다른 데이터 정렬을 지정할 수 없습니다.

  • $lookup 또는 $graphLookup과 같이 여러 뷰를 포함하는 집계를 수행하는 경우 뷰의 데이터 정렬이 동일해야 합니다.

버전 4.2에서 변경되었습니다.

db.createView()은 작업 기간에 지정된 컬렉션 또는 뷰에 대한 배타적 잠금을 얻습니다. 컬렉션에 이루어진 모든 후속 작업은 반드시 db.createView()이 잠금을 해제할 때까지 기다려야 합니다. db.createView()은 일반적으로 이 잠금을 짧은 시간 동안 유지합니다.

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

MongoDB 4.2 이전 버전에서는 db.createView()가 상위 데이터베이스에 대한 배타적 잠금을 획득하여 작업이 완료될 때까지 데이터베이스 모든 해당 컬렉션에 대한 모든 작업을 차단했습니다.

배포서버 에서 인증 을 시행하는 경우:

  • 뷰를 만들려면 뷰가 생성된 데이터베이스 에 대한 권한 이 있어야 합니다.createCollection 또한 생성하려는 뷰의 네임스페이스 에 대한 권한 이 있는 find 경우 find 다음 리소스에 대한 권한 도 있어야 합니다.

    • 새 뷰가 생성되는 소스 컬렉션 또는 뷰입니다.

    • 뷰 파이프라인 에서참조되는 모든 컬렉션 또는 뷰입니다.

  • 뷰를 쿼리 하려면 뷰 네임스페이스 에 대한 find 권한 이 있어야 합니다. 소스 컬렉션 또는 뷰 파이프라인 에서 참조된 네임스페이스에 대한 find 권한 은 필요하지 않습니다.

readWrite 데이터베이스 내장 역할 이 있는 사용자에게는 나열된 작업을 실행 하는 데 필요한 권한이 있습니다. 필요한 권한을 부여하려면 다음 중 하나를 수행합니다.

다음 문서가 포함된 컬렉션 survey 이 제공됩니다.

{ _id: 1, empNumber: "abc123", feedback: { management: 3, environment: 3 }, department: "A" }
{ _id: 2, empNumber: "xyz987", feedback: { management: 2, environment: 3 }, department: "B" }
{ _id: 3, empNumber: "ijk555", feedback: { management: 3, environment: 4 }, department: "A" }

다음 작업은 _id, feedback.managementdepartment 필드가 있는 managementFeedback 뷰를 만듭니다:

db.createView(
"managementFeedback",
"survey",
[ { $project: { "management": "$feedback.management", department: 1 } } ]
)

뷰를 쿼리하려면 뷰에서 db.collection.find() 를 사용할 수 있습니다.

db.managementFeedback.find()

이 작업은 다음 문서를 반환합니다.

{ "_id" : 1, "department" : "A", "management" : 3 }
{ "_id" : 2, "department" : "B", "management" : 2 }
{ "_id" : 3, "department" : "A", "management" : 3 }

다음 작업은 $sortByCount 를 사용하여 department 필드를 기준으로 그룹화하고 각 고유 부서 수를 기준으로 내림차순으로 정렬하여 managementFeedback 뷰에서 애그리게이션을 수행합니다.

db.managementFeedback.aggregate([ { $sortByCount: "$department" } ] )

이 작업은 다음 문서를 반환합니다.

{ "_id" : "A", "count" : 2 }
{ "_id" : "B", "count" : 1 }

다음 두 컬렉션이 주어집니다.

  • orders 컬렉션:

    { "_id" : 1, "item" : "abc", "price" : NumberDecimal("12.00"), "quantity" : 2 }
    { "_id" : 2, "item" : "jkl", "price" : NumberDecimal("20.00"), "quantity" : 1 }
    { "_id" : 3, "item" : "abc", "price" : NumberDecimal("10.95"), "quantity" : 5 }
    { "_id" : 4, "item" : "xyz", "price" : NumberDecimal("5.95"), "quantity" : 5 }
    { "_id" : 5, "item" : "xyz", "price" : NumberDecimal("5.95"), "quantity" : 10 }
  • inventory 컬렉션:

    { "_id" : 1, "sku" : "abc", description: "product 1", "instock" : 120 }
    { "_id" : 2, "sku" : "def", description: "product 2", "instock" : 80 }
    { "_id" : 3, "sku" : "ijk", description: "product 3", "instock" : 60 }
    { "_id" : 4, "sku" : "jkl", description: "product 4", "instock" : 70 }
    { "_id" : 5, "sku" : "xyz", description: "product 5", "instock" : 200 }

다음 db.createView() 예제에서는 $lookup 단계를 지정하여 두 컬렉션의 조인에서 뷰를 생성합니다.

db.createView (
"orderDetails",
"orders",
[
{ $lookup: { from: "inventory", localField: "item", foreignField: "sku", as: "inventory_docs" } },
{ $project: { "inventory_docs._id": 0, "inventory_docs.sku": 0 } }
]
)

뷰를 쿼리하려면 뷰에서 db.collection.find() 를 사용할 수 있습니다.

db.orderDetails.find()

이 작업은 다음 문서를 반환합니다.

{
"_id" : 1,
"item" : "abc",
"price" : NumberDecimal("12.00"),
"quantity" : 2,
"inventory_docs" : [ { "description" : "product 1", "instock" : 120 } ]
}
{
"_id" : 2,
"item" : "jkl",
"price" : NumberDecimal("20.00"),
"quantity" : 1,
"inventory_docs" : [ { "description" : "product 4", "instock" : 70 } ]
}
{
"_id" : 3,
"item" : "abc",
"price" : NumberDecimal("10.95"),
"quantity" : 5,
"inventory_docs" : [ { "description" : "product 1", "instock" : 120 } ]
}
{
"_id" : 4,
"item" : "xyz",
"price" : NumberDecimal("5.95"),
"quantity" : 5,
"inventory_docs" : [ { "description" : "product 5", "instock" : 200 } ]
}
{
"_id" : 5,
"item" : "xyz",
"price" : NumberDecimal("5.95"),
"quantity" : 10,
"inventory_docs" : [ { "description" : "product 5", "instock" : 200 } ]
}

다음 작업은 $sortByCount 를 사용하여 item 필드를 기준으로 그룹화하고 각 고유 항목의 개수를 기준으로 내림차순으로 정렬하여 orderDetails 뷰에서 애그리게이션을 수행합니다.

db.orderDetails.aggregate( [ { $sortByCount: "$item" } ] )

이 작업은 다음 문서를 반환합니다.

{ "_id" : "xyz", "count" : 2 }
{ "_id" : "abc", "count" : 2 }
{ "_id" : "jkl", "count" : 1 }

다음 문서 가 포함된 places 컬렉션 이 주어집니다.

{ _id: 1, category: "café" }
{ _id: 2, category: "cafe" }
{ _id: 3, category: "cafE" }

다음 작업은 뷰 수준에서 데이터 정렬 을 지정하여 뷰를 만듭니다.

db.createView(
"placesView",
"places",
[ { $project: { category: 1 } } ],
{ collation: { locale: "fr", strength: 1 } }
)

뷰의 string 비교는 뷰의 기본값 데이터 정렬을 사용합니다. 예를 예시 다음 작업에서는 뷰의 데이터 정렬을 사용합니다.

db.placesView.count( { category: "cafe" } )

이 작업은 3을 반환합니다.

뷰의 기본 데이터 정렬을 변경하거나 재정의하려는 작업은 오류를 반환하며 실패합니다.

다음도 참조하세요.

돌아가기

db.createCollection