Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ / /

db.createView()

Nesta página

  • Compatibilidade
  • Sintaxe
  • Comportamento
  • Controle de acesso
  • Exemplos
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 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

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). db.createView() cria a visualização aplicando o pipeline especificado na coleção ou exibição do source.

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

    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.

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