【问题标题】:How to query with order by time different如何按时间不同的顺序查询
【发布时间】:2019-06-14 22:36:11
【问题描述】:

我有一个带时间的实时 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 列表过滤?

【问题讨论】:

    标签: angularjs firebase-realtime-database angularfire2


    【解决方案1】:

    Firebase 实时数据库的查询模型适用于您的代码:

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-17
      • 2019-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多