如何按时间查询订单

时间:2019-06-14 06:45:36

标签: angularjs firebase-realtime-database angularfire2

我有一个带有时间的实时Firebase,值如下,计时是每个对象延迟1分钟。

  "-LhIaB7SP0y-FLb1xFFx" : {
    "time" : 1560475623,
    "value" : 11.614479842990287
  },
  "-LhIaJ6PjtbX1VHKlwFM" : {
    "time" : 1560475681,
    "value" : 11.642968895431837
  },
  "-LhIaXbX42k8dmApfztL" : {
    "time" : 1560475741,
    "value" : 11.707783121665505
  },
  "-LhIaqgYSpUmKbcH1MTN" : {
    "time" : 1560475802,
    "value" : 11.704004474172576
  },
  "-LhIb-20G9jnx61vNjS-" : {
    "time" : 1560475861,
    "value" : 11.69861155382089
  },
  "-LhIbDdTEdWrhirbjVRa" : {
    "time" : 1560475921,
    "value" : 11.661539551497276
  },
  "-LhIbSGKvS2POggUCots" : {
    "time" : 1560475981,
    "value" : 11.581711077020692
  }

我可以按顺序检索“时间”的数据。但是我想每5分钟(或1天和一周)进行一次过滤。

this.items = this.db.list(`history/data`, ref => ref.orderByChild("time").limitToLast(1000));

是否有针对此的Firebase列表过滤?

1 个答案:

答案 0 :(得分:0)

Firebase实时数据库的查询模型对您的代码的工作方式如下:

  • 它按您指定的子顺序对引用的子节点进行排序。
  • 它找到结果中的最后一个节点,然后返回之前的1000个节点。

您可以使用startAt()endAt和/或equalTo向查询中添加条件,从而使数据库在该范围内的特定子节点集处开始/结束。但是在这些条件下,无法跳过中间的子节点。一旦数据库找到一个子节点开始返回,它将从那里返回所有子节点,直到不再满足条件为止。

我可以想到的最简单的方法来实现您的要求是将数据存储在要查询的聚合存储桶中。因此,如果您希望以一种可以让您获得每周的第一项和最后一项以及每周的第一项和最后一项的方式读取数据,则可以存储:

2019w24_first: "-LhIaB7SP0y-FLb1xFFx",
2019w24_last: "-LhIbSGKvS2POggUCots",
2019m06_first: "-LhIaB7SP0y-FLb1xFFx",
2019m06_last: "-LhIbSGKvS2POggUCots"

然后每次写入数据时,也会更新相关的聚合。

对于那些有关系/ SQL数据库背景的人们来说,这听起来效率极低,但实际上在NoSQL数据库中非常常见。通过使写操作做一些额外的工作,并存储一些重复的数据,您的读操作将变得可扩展性更高。

有关这些类型的数据建模选择的更多信息,我建议: