Página inicial do Docs → Desenvolver aplicações → Manual do MongoDB
db.createView()
Nesta página
db.createView()
Observação
A página a seguir discute visualizações. Para uma discussão sobre visualizações materializadas sob demanda, consulte
$merge
.Cria um modo de exibição como resultado da aplicação do pipeline de agregação especificado à coleta ou exibição de origem. As exibições atuam como coletas somente leitura e são computadas sob demanda durante as operações de leitura. Você deve criar visualizações no mesmo banco de dados que a coleta de origem. O MongoDB executa operações de leitura em visualizações como parte do pipeline de agregação subjacente.
A definição de visualização
pipeline
não pode incluir o estágio$out
ou$merge
. Se a definição de visualização incluir o pipeline aninhado (por exemplo, a definição de visualização incluir o estágio$lookup
ou$facet
), essa restrição também se aplicará aos pipelines aninhados.db.createView()
tem a seguinte sintaxe:db.createView(<view>, <source>, <pipeline>, <options>) O método aceita os seguintes parâmetros:
ParâmetroTipoDescriçãoview
stringO nome da visualização a ser criada.source
stringO nome da collection de origem ou visualização a partir da qual criar a visualização. O nome não é o namespace completo da collection ou view; ou seja, não inclui o nome do database e implica o mesmo database da view a ser criada. Você deve criar visualizações no mesmo banco de dados que a collection de origem.pipeline
variedadeUm array que consiste nos estágios de aggregation pipeline.
db.createView()
cria a exibição aplicando opipeline
especificado à collection ou exibiçãosource
.A definição de visualização
pipeline
não pode incluir o estágio$out
ou$merge
. Se a definição de visualização incluir o pipeline aninhado (por exemplo, a definição de visualização incluir o estágio$lookup
ou$facet
), essa restrição também se aplicará aos pipelines aninhados.A definição da visualização é pública; ou seja, as operações
db.getCollectionInfos()
eexplain
na exibição incluirão o pipeline que define a visualização. Dessa forma, evite se referir diretamente a campos e valores confidenciais nas definições de visualização.options
documentoOpcional. Opções adicionais para o método.O documento de opções contém o seguinte campo de opção:
CampoTipoDescriçãocollation
documentoOpcional. Especifica o agrupamento padrão para o modo de exibição.
A colocação permite que os usuários especifiquem regras específicas do idioma para comparação de strings, como regras para letras maiúsculas e marcas de acento.
Se o
source
subjacente for uma coleção, a visualização não herda as configurações de agrupamento da coleção.Se nenhum agrupamento for especificado, o agrupamento padrão da exibição será o agrupador de comparação binária "simples".
Se o
source
subjacente for outra visualização, a visualização deverá especificar as mesmas configurações de agrupamento.A opção de agrupamento tem a seguinte sintaxe:
collation: { locale: <string>, caseLevel: <boolean>, caseFirst: <string>, strength: <int>, numericOrdering: <boolean>, alternate: <string>, maxVariable: <string>, backwards: <boolean> } Ao especificar agrupamento, o campo
locale
é obrigatório; todos os outros campos de agrupamento são opcionais. Para obter descrições dos campos, consulte Documento de agrupamento.Novidade na versão 3.4.
O método
db.createView()
envolve a seguinte operação de comandocreate
:db.runCommand( { create: <view>, viewOn: <source>, pipeline: <pipeline>, collation: <collation> } ) As operações que listam collection, como
db.getCollectionInfos()
edb.getCollectionNames()
, incluem visualizações em seus resultados.Importante
A definição da visualização é pública; ou seja, as operações
db.getCollectionInfos()
eexplain
na exibição incluirão o pipeline que define a visualização. Dessa forma, evite se referir diretamente a campos e valores confidenciais nas definições de visualização.Para remover uma visualização, utilize o método
drop()
na visualização.
Comportamento
As visualizações exibem o seguinte comportamento:
Somente leitura
As visualizações são somente leitura; as operações de gravação nas visualizações apresentarão erros.
As seguintes operações de leitura podem ajudar nas visualizações:
Uso do Índice e Operações de Classificação
As visualizações usam os índices da collection subjacente.
Como os índices estão na collection subjacente, você não pode criar, eliminar ou reconstruir índices diretamente na visualização, nem obter uma lista de índices na visualização.
A partir do MongoDB 4.4, você pode especificar uma classificação
$natural
ao executar um comandofind
em uma visualização. Versões anteriores do MongoDB não suportam classificação$natural
nas visualizações.O aggregation pipeline subjacente da visualização está sujeito ao limite de memória de 100 megabytes para block sort e operações de grupo bloqueante. A partir do MongoDB 4.4, você pode emitir um comando
find
comallowDiskUse: true
na visualização para permitir que o MongoDB use arquivos temporários para block sort e operações de grupo.Antes do MongoDB 4.4, somente o comando
aggregate
aceitava a opçãoallowDiskUse
.Dica
Veja também:
Para obter mais informações sobre os limites de memória das operações de block sort, consulte Operações de classificação.
Restrições de projeção
As operações find()
nas visualizações não suportam os seguintes operadores de projeção :
Nome imutável
Não é possível renomear visualizações.
Visualizar criação
As visualizações são computadas sob demanda durante as operações de leitura, e o MongoDB executa operações de leitura em visualizações como parte do pipeline de agregação subjacente. Dessa forma, as visualizações não suportam operações como:
Se o aggregation pipeline usado para criar a exibição suprimir o campo
_id
, os documentos na exibição não terão o campo_id
.
Quando você query uma visualização:
As queries
filter
,projection
,sort
,skip
,limit
e outras operações paradb.collection.find()
são convertidas para os estágiosequivalentes do aggregation pipeline.Os estágios do aggregation pipeline convertidos são adicionados ao final do aggregation pipeline para a visualização. Isso não modifica o pipeline subjacente da visualização, que é definido quando você cria a visualização.
O otimizador de pipeline de agregação remodela os estágios do pipeline de agregação de visualização para melhorar o desempenho. Isso não altera os resultados da query.
Visualização fragmentada
As visualizações serão consideradas fragmentadas se a collection subjacente for fragmentada. Dessa forma, você não pode especificar uma visualização fragmentada para o campo from
nas operações $lookup
e $graphLookup
.
Visualizações e agrupamento
Você pode especificar um agrupamento padrão para uma visualização no momento da criação. Se nenhum agrupamento for especificado, o agrupamento padrão da visualização será o coletor de comparação binária "simples". Ou seja, a visualização não herda o agrupamento padrão da collection.
As comparações de strings na visualização usam o agrupamento padrão da visualização. Uma operação que tenta alterar ou substituir a coleta padrão de uma visualização falhará com um erro.
Se estiver criando um modo de exibição a partir de outro modo de exibição, você não poderá especificar um agrupamento que difere do agrupamento do modo de exibição de origem.
Se executar uma aggregation que envolve múltiplas visualizações, como com
$lookup
ou$graphLookup
, as visualizações deverão ter o mesmo agrupamento.
Bloqueio de recursos
Alterado na versão 4,2.
db.createView()
obtém um bloqueio exclusivo na coleção ou visualização especificada durante a operação. Todas as operações subsequentes na coleção devem aguardar até que db.createView()
libere o trava. db.createView()
normalmente mantém essa trava por um curto período.
Criar uma visualização exige a obtenção de uma trava exclusiva adicional na collection system.views
no banco de dados. Essa trava
bloqueia a criação ou modificação de visualizações no banco de dados até que o comando seja concluído.
Antes do MongoDB 4.2, db.createView()
obteve uma trava exclusiva no banco de dados pai, bloqueando todas as operações no banco de dados e todas as suas collections até a operação ser concluída.
Controle de acesso
Se a implementação impor a autenticação, db.createView()
exigirá que o usuário autenticado tenha o privilégio createCollection
no banco de dados.
No entanto, se o usuário tiver createCollection
no banco de dados e find
na visualização a ser criada, ele também deverá ter as seguintes permissões adicionais:
find
na collection ou visualização de origem.find
em quaisquer outras collections ou visualizações referenciadas nopipeline
, se houver.
Um usuário com a role embutida readWrite
no banco de dados tem os privilégios exigidos para executar as operações listadas. Criar um usuário com a role necessária ou conceder a role a um usuário existente
Exemplos
Criar uma visualização a partir de uma única collection
Dada uma collection survey
com os seguinte documento:
{ _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" }
A seguinte operação cria uma visualização do managementFeedback
com os campos _id
, feedback.management
e department
:
db.createView( "managementFeedback", "survey", [ { $project: { "management": "$feedback.management", department: 1 } } ] )
query uma Visualização
Para fazer query na visualização, você pode usar db.collection.find()
na visualização:
db.managementFeedback.find()
A operação retorna os seguintes documentos:
{ "_id" : 1, "department" : "A", "management" : 3 } { "_id" : 2, "department" : "B", "management" : 2 } { "_id" : 3, "department" : "A", "management" : 3 }
Executar pipeline de agregação em uma visualização
A operação a seguir executa uma agregação na visualização managementFeedback
, usando o $sortByCount
para agrupar pelo campo department
e classificar em ordem decrescente pela contagem de cada departamento distinto:
db.managementFeedback.aggregate([ { $sortByCount: "$department" } ] )
A operação retorna os seguintes documentos:
{ "_id" : "A", "count" : 2 } { "_id" : "B", "count" : 1 }
Crie uma visualização a partir de múltiplas collection
Dadas as duas collection a seguir:
A collection
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 } A collection
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 }
O exemplo db.createView()
a seguir especifica um estágio $lookup
para criar uma visualização a partir da união das duas collections:
db.createView ( "orderDetails", "orders", [ { $lookup: { from: "inventory", localField: "item", foreignField: "sku", as: "inventory_docs" } }, { $project: { "inventory_docs._id": 0, "inventory_docs.sku": 0 } } ] )
query uma Visualização
Para fazer query na visualização, você pode usar db.collection.find()
na visualização:
db.orderDetails.find()
A operação retorna os seguintes documentos:
{ "_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 } ] }
Executar pipeline de agregação em uma visualização
A operação a seguir executa uma agregação na visualização orderDetails
, usando o $sortByCount
para agrupar pelo campo item
e classificar em ordem decrescente pela contagem de cada item distinto:
db.orderDetails.aggregate( [ { $sortByCount: "$item" } ] )
A operação retorna os seguintes documentos:
{ "_id" : "xyz", "count" : 2 } { "_id" : "abc", "count" : 2 } { "_id" : "jkl", "count" : 1 }
Crie uma visualização com agrupamento padrão
Dada a collection places
com o seguinte documento:
{ _id: 1, category: "café" } { _id: 2, category: "cafe" } { _id: 3, category: "cafE" }
A operação a seguir cria uma visualização, especificando o agrupamento no nível de visualização:
db.createView( "placesView", "places", [ { $project: { category: 1 } } ], { collation: { locale: "fr", strength: 1 } } )
As comparações de strings na visualização usam o agrupamento padrão da visualização. Por exemplo, a operação a seguir usa o agrupamento da visualização:
db.placesView.count( { category: "cafe" } )
A operação retorna 3
.
Uma operação que tenta alterar ou substituir a coleta padrão de uma visualização falhará com um erro.