Menu Docs
Página inicial do Docs
/ /

Visualizações materializadas sob demanda

Observação

Desambiguação

Esta página discute visualizações materializadas on-demand. Para uma discussão sobre as visualizações padrão, consulte Visualizações.

Para entender as diferenças entre os tipos de visualização, consulte Comparação com Visualizações Padrão.

Uma visualização materializada on-demand é um resultado de aggregation pipeline pré-computado que é armazenado e lido a partir do disco. Visualizações materializadas on-demand são normalmente os resultados de um estágio $merge ou $out.

O MongoDB oferece dois tipos de visualização diferentes: visualizações padrão e visualizações materializadas on-demand. Ambos os tipos de exibição retornam os resultados de um aggregation pipeline.

  • As visualizações padrão são calculadas quando você lê a visualização e não são armazenadas no disco.

  • As visualizações materializadas sob demanda são armazenadas e lidas no disco. Eles usam um $merge ou $out estágio para atualizar os dados salvos.

    Observação

    Ao usar $merge, você pode usar change streams para observar alterações na visualização materializada. Ao usar $out, você não pode observar alterações na visualização materializada.

As visualizações padrão usam os índices da coleta subjacente. Como resultado , você não pode criar, eliminar ou reconstruir índices diretamente em uma visualização , nem obter uma lista de índices na visualização.

Você pode criar índices diretamente em visualizações materializadas sob demanda porque eles são armazenados em disco.

As visualizações materializadas sob demanda fornecem melhor desempenho de leitura do que as visualizações porque são lidas do disco em vez de computadas como partes da consulta. Esse benefício de desempenho aumenta com base na complexidade do pipeline e no tamanho dos dados que estão sendo agregados.

O exemplo nesta seção utiliza o conjunto de dados de treinamento de amostra. Para saber como carregar o conjunto de dados de amostra em sua implantação do MongoDB Atlas, consulte Carregar Dados de Amostra.

Para criar uma visualização materializada na UI do MongoDB Atlas, siga estas etapas:

1
  1. Se ainda não tiver sido exibido, selecione a organização que contém seu projeto no menu Organizations na barra de navegação.

  2. Se ainda não estiver exibido, selecione seu projeto no menu Projects na barra de navegação.

  3. Na barra lateral, clique em Clusters sob o título Database.

    A página Clusters é exibida.

2
  1. Para o cluster que contém os dados de amostra, clique em Browse Collections.

  2. No painel de navegação esquerdo, selecione o banco de dados sample_training.

  3. Selecione a collection grades.

3
4
5

O estágio de agregação transforma os dados que você deseja salvar em uma visualização. Para saber mais sobre os estágios de agregação disponíveis, consulte Estágios de Agregação.

Para este exemplo, adicione um novo campo com o estágio $set:

  1. Selecione $set no menu suspenso Select.

  2. Adicione a seguinte sintaxe ao editor do aggregation pipeline para criar uma pontuação média em todos os valores de score na array scores dentro da coleção grades:

    {
    averageScore: { $avg: "$scores.score" }
    }

    O MongoDB Atlas adiciona o valor do averageScore a cada documento.

6
7
  1. Selecione o estágio $out no menu suspenso Select.

  2. Adicione a seguinte sintaxe ao aggregation pipeline, para gravar os resultados do pipeline na coleção do myView no banco de dados do sample_training :

    'myView'
  3. Clique em Save Documents.

O estágio $out grava os resultados do pipeline de agregação na coleção especificada, que cria a visualização. Para saber mais, consulte $out.

Atualize a lista de coleções para ver a collection myView.

Para aprender como consultar a coleção do myView na UI do MongoDB Atlas, consulte Visualizar, Filtrar e Classificar Documentos na documentação do MongoDB Atlas.

O exemplo utiliza a coleção movies do conjunto de dados sample_mflix. Para saber como carregar dados de amostra, consulte Carregar dados de amostra.

A função updateMovieStats a seguir define uma visualização materializada movieYearStats que contém a contagem e a classificação média do IMDb de filmes por ano. A função aceita um parâmetro startYear para atualizar as estatísticas de filmes lançados a partir desse ano.

updateMovieStats = function(startYear) {
db.movies.aggregate( [
{ $match: { year: { $gte: startYear } } },
{ $group: {
_id: "$year",
movieCount: { $sum: 1 },
avgRating: { $avg: "$imdb.rating" }
} },
{ $merge: { into: "movieYearStats", whenMatched: "replace" } }
] );
};
  • O estágio $match filtro os filmes para processar apenas aqueles com um valor year maior ou igual a startYear.

  • O estágio $group agrupa filmes por year. Os documentos gerados por esse estágio têm o formato:

    { "_id" : <year>, "movieCount" : <num>, "avgRating" : <num> }
  • O estágio $merge escreve o resultado na collection movieYearStats.

    O estágio corresponde ao campo _id e verifica se cada resultado de agregação corresponde a um documento existente:

Para a execução inicial, passe um ano de início para preencher movieYearStats com dados daquele ano em diante:

updateMovieStats(2015);

Após a execução inicial, o db.movieYearStats.find().sort( { _id: 1 } ) retorna documentos como o seguinte:

{ "_id" : 2015, "movieCount" : <num>, "avgRating" : <num> }
{ "_id" : 2016, "movieCount" : <num>, "avgRating" : <num> }
{ "_id" : 2017, "movieCount" : <num>, "avgRating" : <num> }

Suponha que um novo filme seja adicionado à coleção movies para 2016:

db.movies.insertOne( {
title: "Grove Test Movie",
year: 2016,
imdb: { rating: 7.5, votes: 500 }
} )

Para atualizar movieYearStats para 2016 em diante, execute a função com um startYear de 2016:

updateMovieStats(2016);

O movieYearStats atualizado reflete o novo filme na coleção movies. db.movieYearStats.find().sort( { _id: 1 } ) retorna:

{ "_id" : 2015, "movieCount" : <num>, "avgRating" : <num> }
{ "_id" : 2016, "movieCount" : <num>, "avgRating" : <num> }
{ "_id" : 2017, "movieCount" : <num>, "avgRating" : <num> }

O estágio $merge:

  • Pode enviar para uma coleção no mesmo banco de dados ou em um banco de dados diferente.

  • Cria uma nova coleta se a coleta de saída ainda não existir.

  • Pode incorporar resultados (inserir novos documentos, mesclar documentos, substituir documentos, manter documentos existentes, falhar a operação, processar documentos com um pipeline de atualização personalizado) a uma coleção existente.

  • Pode gerar saída para uma coleção fragmentada. A coleta de entrada também pode ser fragmentada.

Consulte $merge para:

Voltar

Operações suportadas

Nesta página