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

Armazenar dados computados

Nesta página

  • Sobre esta tarefa
  • Passos
  • Resultados
  • Saiba mais

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.

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.

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.

1

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

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

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ção movies, 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"
}
}
] )
4

Para confirmar que a coleção movies foi atualizada, faça a query da coleção:

db.movies.find()

Saída:

[
{
_id: 1,
title: 'Lost in the Shadows',
total_viewers: 2600,
total_revenue: 33480
}
]

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.

  • Usar o padrão de aproximação

  • Dados do grupo

  • Consistência de dados

Voltar

Valores calculados