Visualizações
Nesta página
Uma visualização do MongoDB é um objeto consultável cujo conteúdo é definido por umaggregation pipeline em outras collections ou visualizações. O MongoDB não persiste o conteúdo da visualização no disco. O conteúdo de uma visualização é computado sob-demanda quando um cliente consulta a visualização. O MongoDB pode exigir que os clientes tenham permissão para consultar a visualização. O MongoDB não suporta operações de gravação contra visualizações.
Por exemplo, você pode:
Crie uma view em uma collection de dados de funcionários para
exclude
qualquer informação privada ou pessoal (PII). A aplicação pode query a visualização de dados de funcionários que não contenham nenhuma PII.Crie uma visualização em uma collection de dados de sensores coletados para
add
campos e métricas computados. A aplicação pode usar operações de localização simples para fazer a query dos dados.Crie uma visualização de que
joins
duas collection contendo estoque e histórico de pedidos, respectivamente. A aplicação pode fazer query dos dados unidos sem gerenciar ou entender o pipeline complexo subjacente.
Você pode criar visualizações materializadas na interface do usuário para implantações hospedadas no MongoDB Atlas.
Quando os clientes consultam uma visualização, o MongoDB acrescenta a consulta do cliente ao pipeline subjacente e retorna os resultados desse pipeline combinado para o cliente. O MongoDB pode aplicar otimizações de pipeline de agregação ao pipeline combinado.
Observação
A página a seguir discute visualizações. Para discussões sobre visualizações materializadas on-demand, consulte Visualizações materializadas sob demanda .
Criar visualização
Para criar ou definir uma visualização:
Utilize o método
db.createCollection()
ou o comandocreate
:db.createCollection( "<viewName>", { "viewOn" : "<source>", "pipeline" : [<pipeline>], "collation" : { <collation> } } ) Use o método
db.createView()
:db.createView( "<viewName>", "<source>", [<pipeline>], { "collation" : { <collation> } } )
Observação
- Você deve criar visualizações no mesmo reconhecimento de data center que a collection de origem.
Aviso
Não tente criar uma coleção de séries temporais ou visualizar com o nome system.profile
porque o servidor MongoDB falhará.
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.
Isolamento de snapshot
As visualizações não mantêm registros de data e hora das alterações da coleção e não são compatíveis com o isolamento de leituras pontuais ou de snapshots.
Definição de exibição pública
As operações que listam collection, 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.
Eliminar uma Visualização
Para remover uma visualização, utilize o método db.collection.drop()
na visualização.
Modificar uma visualização
Você pode modificar uma visualização soltando e recriando a visualização ou utilizando o comando collMod
.
Operações suportadas
As operações a seguir fornecem suporte para visualizações, exceto para as restrições mencionadas nesta página:
Comandos | Métodos |
---|---|
Exemplos
Crie a collection students
para utilizar nos seguintes exemplos:
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 }, ] )
Use db.createView() para criar uma visualização
Use o db.createView()
para criar uma visualização limitada aos alunos do primeiro ano:
db.createView( "firstYears", "students", [ { $match: { year: 1 } } ] )
No exemplo:
firstYears
é o nome da nova visualização.students
é a collection na qual a visualização se baseia.$match
é uma expressão de aggregation que corresponde aos alunos do primeiro ano na collectionstudents
.
Este exemplo consulta a visualização:
db.firstYears.find({}, { _id: 0 } )
O resultado a seguir contém apenas os documentos com dados sobre os alunos do primeiro ano. A projeção do { _id: 0 }
suprime o campo _id
na saída.
[ { 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 } ]
Use db.createCollection() para criar uma visualização
O método db.createCollection()
permite a você criar uma collection ou uma visualização com opções específicas.
O exemplo a seguir cria uma visualização graduateStudents
. O modo de exibição contém apenas documentos selecionados pelo estágio $match
. A configuração de agrupamento opcional determina a ordem de classificação.
db.createCollection( "graduateStudents", { viewOn: "students", pipeline: [ { $match: { $expr: { $gt: [ "$year", 4 ] } } } ], collation: { locale: "en", caseFirst: "upper" } } )
O exemplo a seguir consulta a visualização. O estágio $unset
remove o campo _id
da saída para maior clareza.
db.graduateStudents.aggregate( [ { $sort: { name: 1 } }, { $unset: [ "_id" ] } ] )
Quando a saída é classificada, o estágio $sort
usa a ordem de agrupamento para classificar as letras maiúsculas antes das letras minúsculas.
[ { sID: 18020, name: 'Harley', year: 5, score: 2.8 }, { sID: 17301, name: 'harley', year: 6, score: 3.1 } ]
Use uma visualização para participar de duas collections
Muitas vezes, é conveniente usar $lookup
para criar uma visualização sobre duas collection e, em seguida, executar query na visualização. Os aplicativos podem consultar a visualização sem precisar construir ou manter pipelines complexos.
Crie duas collections de amostra, inventory
e orders
:
db.inventory.insertMany( [ { prodId: 100, price: 20, quantity: 125 }, { prodId: 101, price: 10, quantity: 234 }, { prodId: 102, price: 15, quantity: 432 }, { prodId: 103, price: 17, quantity: 320 } ] ) db.orders.insertMany( [ { orderID: 201, custid: 301, prodId: 100, numPurchased: 20 }, { orderID: 202, custid: 302, prodId: 101, numPurchased: 10 }, { orderID: 203, custid: 303, prodId: 102, numPurchased: 5 }, { orderID: 204, custid: 303, prodId: 103, numPurchased: 15 }, { orderID: 205, custid: 303, prodId: 103, numPurchased: 20 }, { orderID: 206, custid: 302, prodId: 102, numPurchased: 1 }, { orderID: 207, custid: 302, prodId: 101, numPurchased: 5 }, { orderID: 208, custid: 301, prodId: 100, numPurchased: 10 }, { orderID: 209, custid: 303, prodId: 103, numPurchased: 30 } ] )
Crie uma visualização que combine elementos de cada collection:
db.createView( "sales", "orders", [ { $lookup: { from: "inventory", localField: "prodId", foreignField: "prodId", as: "inventoryDocs" } }, { $project: { _id: 0, prodId: 1, orderId: 1, numPurchased: 1, price: "$inventoryDocs.price" } }, { $unwind: "$price" } ] )
No exemplo:
db.createView()
cria a visualizaçãosales
.A visualização
sales
é baseada na collectionorders
.O estágio
$lookup
usa o campoprodId
na collectionorders
para "unir" documentos na collectioninventory
que tenham camposprodId
correspondentes.Os documentos correspondentes são adicionados como uma array no campo
inventoryDocs
.O estágio
$project
seleciona um subconjunto dos campos disponíveis.O estágio
$unwind
converte o campoprice
de uma array para um valor escalar.
Os documentos na visualização sales
são:
{ prodId: 100, numPurchased: 20, price: 20 }, { prodId: 101, numPurchased: 10, price: 10 }, { prodId: 102, numPurchased: 5, price: 15 }, { prodId: 103, numPurchased: 15, price: 17 }, { prodId: 103, numPurchased: 20, price: 17 }, { prodId: 102, numPurchased: 1, price: 15 }, { prodId: 101, numPurchased: 5, price: 10 }, { prodId: 100, numPurchased: 10, price: 20 }, { prodId: 103, numPurchased: 30, price: 17 }
Para encontrar o valor total vendido de cada produto, consulte a visualização:
db.sales.aggregate( [ { $group: { _id: "$prodId", amountSold: { $sum: { $multiply: [ "$price", "$numPurchased" ] } } } } ] )
A saída é:
[ { _id: 100, amountSold: 600 }, { _id: 103, amountSold: 1105 }, { _id: 101, amountSold: 150 }, { _id: 102, amountSold: 90 } ]