因此,我有一个数据库(MongoDB),每隔几分钟我就会在其中存储温度(现在有超过2万个条目)。我想在我的网站上显示有关此数据的一些统计信息(在Node.js / Express + Mongoose上运行)。
现在,我想计算一些统计信息(平均,最大值,最小值,...)并将其显示在我的网站上。目前,我循环浏览前端(javascript)中的所有条目,这会减慢一切。
实现此目标的最佳方法是什么?
答案 0 :(得分:1)
通常,最好的方法是拥有一个预先汇总的文档。在将新数据插入“主”集合中的同时,将同时更新该文档。
以您的示例为例,如果只需要avg,max和min,则可以创建如下文档:
{
max: <max value seen so far>,
min: <min value seen so far>,
avg: <avg value seen so far>,
sum: <total value seen so far>,
n: <number of data points seen so far>
}
请注意,要能够计算新的平均值,您将需要上面文档中的sum
和n
字段。每次插入新数据时,如果您担心原子性问题,请使用新的MongoDB 4.0 transactions feature来更新此文档。
此后,查找最小值,最大值,平均值仅是一个find()
命令,用于显示此文档的内容。
有关此想法的更复杂示例,请参见Hierarchical Aggregation。