Armazenar dados computados
Nesta página
Um aplicação pode precisar derivar um valor dos dados de origem armazenados em um banco de dados de dados. O cálculo de um novo valor pode exigir recursos significativos da CPU, especialmente no caso de grandes conjuntos de dados ou nos casos em que vários documentos devem ser examinados.
Se um valor calculado for solicitado com frequência, pode ser mais eficiente salvar esse valor no banco de dados de dados com antecedência. Quando o aplicação solicita dados, apenas uma operação de leitura é necessária.
Sobre esta tarefa
Se as leituras forem significativamente mais comuns do que as gravações, o padrão computado reduzirá a frequência da computação de dados. Em vez de calcular valores em cada leitura, o aplicação armazena o valor calculado e o recalcula conforme necessário. O aplicação pode recalcular o valor a cada gravação que altere os dados de origem do valor calculado ou como parte de um tarefa periódico.
Observação
Com atualizações periódicas, não é garantido que o valor calculado retornado seja exato. No entanto, essa abordagem pode valer a melhoria de desempenho se a precisão exata não for um requisito.
Passos
Neste exemplo, um aplicação exibe informações de rendimento e visualizador de filme. Os usuários podem procurar um filme específico e quanto esse filme rendeu.
Inserir dados de amostra
Crie a coleção screenings
:
db.screenings.insertMany( [ { theater: "Alger Cinema", location: "Lakeview, OR", movie_title: "Lost in the Shadows", movie_id: 1, num_viewers: 344, revenue: 3440 }, { theater: "City Cinema", location: "New York, NY", movie_title: "Lost in the Shadows", movie_id: 1, num_viewers: 1496, revenue: 22440 }, ] )
Inserir dados computados
Os usuários geralmente querem saber quantas pessoas assistiram a um determinado filme e quanto esse filme rendeu. No esquema atual, para adicionar num_viewers
e revenue
, você deve realizar uma leitura para os cinemas que exibiram um filme com o título "Lost in the shadows" e somar os valores desses campos.
Para evitar realizar esse cálculo toda vez que as informações forem solicitadas, você pode calcular os valores totais e armazená-los em uma collection movies
com o próprio registro de filme:
db.movies.insertOne( { _id: 1, title: "Lost in the Shadows", total_viewers: 1840, total_revenue: 25880 } )
Dados computados atualizados
Considere um novo rastreamento adicionado à coleção screenings
:
db.screenings.insertOne( { theater: "Overland Park Cinema", location: "Boise, ID", movie_title: "Lost in the Shadows", movie_id: 1, num_viewers: 760, revenue: 7600 } )
Os dados computados na coleção movies
não refletem mais os dados de rastreamento atuais. A frequência com que você atualiza os dados calculados depende do seu aplicação:
Em um ambiente de baixa gravação, o cálculo pode ocorrer em conjunto com qualquer atualização dos dados do
screenings
.Em um ambiente com gravações mais regulares, os cálculos podem ser feitos em intervalos definidos (a cada hora, por exemplo). Os dados de origem no
screenings
não são afetados por gravações na coleçãomovies
, portanto, você pode executar cálculos a qualquer momento.
Para atualizar os dados calculados com base nos dados de rastreamento, você pode executar a seguinte agregação em um intervalo regular:
db.screenings.aggregate( [ { $group: { _id: "$movie_id", total_viewers: { $sum: "$num_viewers" }, total_revenue: { $sum: "$revenue" } } }, { $merge: { into: { db: "test", coll: "movies" }, on: "_id", whenMatched: "merge" } } ] )
Resultados
O padrão computado reduz o volume de trabalho da CPU e aumenta o desempenho do aplicação . Considere o padrão computado que seu aplicação executa os mesmos cálculos repetidamente e tem uma alta taxa de leitura para gravação.