我有问题,但不知道如何解决它。 我在MongoDB中有PointValues集合。 PointValue 架构有3个参数:
- dataPoint(参考
DataPoint
架构)- value(
Number
)- 时间(
Date
)
每小时(每天24小时)有一个 pointValue 。
我有API方法来获取指定DataPoint
和时间范围的 PointValues 。问题是我需要将其限制为最多1000点。典型的极限(1000)方法并不是好方法,因为我需要指向整个指定时间范围,时间步长取决于指定的时间范围和点值计数。
所以...例如:
请求数据1年= 1 * 365 * 24 = 8760 它应返回1000个值,但每个(24 /(1000/365))= ~9小时约1个值
我不知道我应该使用什么方法来过滤MongoDB中的数据。
感谢您的帮助。
答案 0 :(得分:1)
像数据库中那样完全采样很难做到,而且可能性能不高。但是,为您提供类似结果的选项将是使用$group
$first
best value到$year
, $dayOfYear
, and $hour
(and $minute
and $second
if you need smaller intervals)的汇总管道。这样,您可以按时间步长对值进行采样,但您对步长的选择仅限于您拥有日期运算符的值。所以"每小时"样品很简单,但每小时9小时#34;样本变得复杂。当此查询对性能至关重要且频繁时,您可能需要考虑使用每日,每小时,每分钟等DataPoint
来创建其他集合,这样您就不需要在每个请求上执行该聚合。
但由于实际有效负载位于不同的集合中,因此您的文档非常轻量级。因此,您可能会考虑在请求的时间范围内获取 all 结果,然后跳过应用程序层。您可能需要考虑将此与上述聚合相结合以预先减少数据集。因此,您可以首先使用聚合管道将每小时结果输入应用程序,然后以9个文档的步骤跳过结果集。这是否有意义取决于您期望的文档数量。
还记得在time
- 字段上创建一个排序索引。