Menu Docs
Página inicial do Docs
/ /
Bancos de dados

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.

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 a todos os comandos, consulte Comandos não suportados.

  • 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

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 nos estágios de agregação pipeline. db.createView() cria a exibição aplicando o especificado pipeline à source collection ou exibição.

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() 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.

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 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 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.

As visualizações exibem o seguinte comportamento:

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:

  • 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 comando find 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 com allowDiskUse: 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ção allowDiskUse .

    Dica

    Para obter mais informações sobre os limites de memória das operações de block sort, consulte Operações de classificação.

As operações find() nas visualizações não suportam os seguintes operadores de projeção :

Não é possível renomear visualizações.

  • 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 para db.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.

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 .

  • 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.

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.

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á ter find o find 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égio find 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:

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 } } ]
)

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 }

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 }

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 } }
]
)

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 } ]
}

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 }

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.

Voltar

db.createCollection

Nesta página