Docs 菜单

Docs 主页开发应用程序MongoDB Manual

对计算数据进行建模

在此页面上

  • 概述
  • 计算模式
  • 例子

应用程序通常需要从数据库中存储的源数据中获取值。 计算新值可能需要大量 CPU 资源,尤其是在大型数据集或必须检查多个文档的情况下。

如果经常请求计算值,则提前将该值保存在数据库中可能会更有效。 这样,当应用程序请求数据时,只需执行一次读取操作。

如果读取次数明显多于写入次数,则计算模式会降低执行计算的频率。 应用程序不会将计算负担附加到每次读取上,而是会存储计算出的值并根据需要重新计算。 应用程序可以在每次写入更改计算值的源数据时重新计算值,也可以将其作为定期作业的一部分重新计算。

注意

通过定期更新,不能保证计算值在任何给定读取中都是准确的。 但是,如果不要求精确性,则这种方法可能值得提高性能。

应用程序显示电影观看器和收入信息。

考虑以下 screeningscollection:

db.screenings.insertMany( [
{
theater : "Alger Cinema",
location : "Lakeview, OR",
movie_title : "Reservoir Dogs",
num_viewers : 344,
revenue : 3440
},
{
theater : "City Cinema",
location : "New York, NY",
movie_title : "Reservoir Dogs",
num_viewers : 1496,
revenue : 22440
},
{
theater : "Overland Park Cinema",
location : "Boise, ID",
movie_title : "Reservoir Dogs",
num_viewers : 760,
revenue : 7600
}
] )

用户通常想知道有多少人观看了某部电影以及该电影赚了多少钱。 在此示例中,要计算num_viewersrevenue的总计,您必须读取放映过名为“落水狗”的电影的电影院,并对这些字段的值求和。为避免每次请求信息时都执行该计算,您可以计算总值并将其与电影记录一起存储在moviescollection中:

db.movies.insertOne( [
{
title : "Reservoir Dogs",
total_viewers : 2600,
total_revenue : 33480,
...
}
] )

在低写入环境中,计算可以与screenings数据的任何更新一起完成。

在写入更频繁的环境中,可以按定义的时间间隔(例如每小时)完成计算。 screenings中的源数据不受写入moviescollection的影响,因此您可以随时运行计算。

这是一种常见的设计模式,可减少 CPU 工作负载并提高应用程序性能。 每当您重复执行相同的计算并且读写比率较高时,请考虑计算模式。

除了经常请求求和的情况(例如获取电影数据库示例中的总收入或观众数)之外,计算模式还非常适合需要对数据运行计算的任何情况。 例如:

  • 一家汽车公司,对车辆数据运行大量聚合查询,并存储结果以在接下来的几个小时内显示,直到重新计算数据。

  • 一家消费者报告公司,它会编译来自多个不同来源的数据以创建按排名排序的列表,例如“100 个最佳评论小工具”。 列表可以定期重新生成,同时独立更新底层数据。

← 对物联网 (IoT) 数据进行建模