db.createView()
db.createView()
Observação
A página a seguir discute visualizações. Para uma discussão sobre visualizações materializadas sob demanda, consulte
$merge
em vez disso.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.
Compatibilidade
Esse método está disponível em implantações hospedadas nos seguintes ambientes:
MongoDB Atlas: o serviço totalmente gerenciado para implantações do MongoDB na nuvem
Observação
Este comando é aceito em todos os clusters do MongoDB Atlas. Para obter informações sobre o suporte do Atlas para todos os comandos, consulte Comandos sem suporte.
MongoDB Enterprise: a versão autogerenciada e baseada em assinatura do MongoDB
MongoDB Community: uma versão com código disponível, de uso gratuito e autogerenciada do MongoDB
Sintaxe
db.createView
tem a seguinte sintaxe:
db.createView(<view>, <source>, <pipeline>, <options>)
O método aceita os seguintes parâmetros:
Parâmetro | Tipo | Descrição |
---|---|---|
view | string | O nome da visualização a ser criada. |
source | string | O 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 | array | Um array que consiste na(s) fase(s) do pipeline de agregação). A definição de visualização A definição da visualização é pública; ou seja, as operações |
options | documento | Opcional. Opções adicionais para o método. |
O documento de opções contém o seguinte campo de opção:
Campo | Tipo | Descrição | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
collation | documento | Opcional. 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 Se nenhum agrupamento for especificado, o agrupamento padrão da exibição será o agrupador de comparação binária "simples". Se o A opção de agrupamento tem a seguinte sintaxe:
Ao especificar agrupamento, o campo Novidade na versão 3.4. |
O método db.createView()
envolve a seguinte operação de comando create
:
db.runCommand( { create: <view>, viewOn: <source>, pipeline: <pipeline>, collation: <collation> } )
As operações que listam coletas, como db.getCollectionInfos()
e db.getCollectionNames()
, incluem visualizações em seus resultados.
Importante
A definição da visualização é pública; ou seja, as operações db.getCollectionInfos()
e explain
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 bloqueio. db.createView()
normalmente mantém essa trava por um curto período de tempo.
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, o db.createView()
obtinha um bloqueio exclusivo no banco de dados principal, bloqueando todas as operações no banco de dados e todas as suas coleções até a operação ser concluída.
Controle de acesso
Se o sistema impuser autenticação:
Para criar uma visualização, você deve ter o privilégio no banco de dados de dados em que a visualização é
createCollection
criada. Além disso, se você tiver o privilégio no namespace da visualização que deseja criar, também deverá terfind
ofind
privilégio nos seguintes recursos:A coleção de origem ou visualização a partir da qual a nova visualização é criada.
Quaisquer collections ou visualizações referenciadas no pipeline de visualização.
Para executar query de uma visualização, você deve ter o privilégio
find
no namespace da visualização. Você não precisa do privilégiofind
na collection de origem ou em qualquer namespace referenciado no pipeline da visualização.
Um usuário com o papel embutido no banco de banco de dados tem os privilégios exigidos para executar as operações readWrite
listadas. Para conceder as permissões necessárias:
Crie um usuário com a função necessária.
Exemplos
Criar uma visualização a partir de uma única collection
Dada uma collection survey
com os seguintes documentos:
{ _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 } } ] )
Consultar uma Visualização
Para fazer query na visualização, você pode utilizar 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 collections
Dadas as duas coleções 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 } } ] )
Consultar uma Visualização
Para fazer query na visualização, você pode utilizar 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 coleção 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 da visualização:
db.createView( "placesView", "places", [ { $project: { category: 1 } } ], { collation: { locale: "fr", strength: 1 } } )
comparações de string 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.