在MongoDB中查找具有非典型限制的文档

时间:2017-02-17 10:43:36

标签: node.js mongodb mongoose

我有问题,但不知道如何解决它。 我在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中的数据。

感谢您的帮助。

1 个答案:

答案 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 - 字段上创建一个排序索引。