【问题标题】:Angularfire2 querying with timestampAngularfire2使用时间戳查询
【发布时间】:2018-04-21 02:11:21
【问题描述】:

我是 Angular 和 Firebase 的新手。而且我来自 SQL 查询,所以在 firebase 中查询对我来说可能很棘手。

我在 firebase 中有这个对象结构:([EDIT] - firebase 中真正的 JSON 结构)

"acceleration-values" : {
    "-KyGw8gDF4thAie8_hYk" : {
      "timestamp" : "2017/10/1_15:26:24:712",
      "value" : 2.3403
    },
    "-KyGw8if5_oCaqy1b9Y8" : {
      "timestamp" : "2017/10/1_15:26:24:912",
      "value" : 4.38385
    },
    "-KyGw8ou_viOW6hKARTC" : {
      "timestamp" : "2017/10/1_15:26:25:310",
      "value" : 0.28864
    },
    "-KyGw8yJw_cgwuB4tYyu" : {
      "timestamp" : "2017/10/1_15:26:25:912",
      "value" : 1.6212
    },
    "-KyGw96gH7O6h3oPAyCf" : {
      "timestamp" : "2017/10/1_15:26:26:512",
      "value" : 4.36751
    }
  }

当 'timestamp' 等于或大于某个值时,我需要获取加速对象。

我在 angular 和 firebase 文档中进行了搜索,但没有成功。我尝试使用“startAt”但没有成功,因为也许我不知道如何正确使用它。我认为我的问题非常具体,文档无法提供帮助。

如果我能得到一些帮助,我将不胜感激。 还是谢谢你。

=== [编辑] ===

正如@Chris 提到的,我可以将数据存储为地图。老实说,该解决方案看起来既好又简单。 我只需要提问: 1. 除了值,我如何检索键(时间戳)? 2. 如果我实施了该解决方案,我可以添加用户吗?就像有这样的东西:

- acceleration-values:{
        - user_1: {
            - 2017-11-08T01:00:00+01:00: X.XXXX
            - 2017-11-09T01:00:00+01:00: X.XXXX
        }
        - user_2: {
            - 2017-11-08T01:00:00+01:00: X.XXXX
            - 2017-11-08T01:00:00+01:00: X.XXXX
            - 2017-11-08T01:00:00+01:00: X.XXXX
            - 2017-11-09T01:00:00+01:00: X.XXXX
        }
        - user_3: {
            - 2017-11-08T01:00:00+01:00: X.XXXX
            - 2017-11-08T01:00:00+01:00: X.XXXX
            - 2017-11-09T01:00:00+01:00: X.XXXX
        }
    }

如果我可以在编辑中显示一些东西,那就太棒了。

再次感谢您。

=== [编辑 - 2] ===

这就是我所拥有的。它为我提供了 firebase 中的所有值,但如前所述,我只需要给定时间戳之后的值(和时间戳)。

this.accelerationValuesRef = this.db.list('/acceleration-values');

this.accelerationSubscription = this.accelerationValuesRef.snapshotChanges()
  .map(actions => {
    return actions.map(action => {
      const data = action.payload.val();
      const $key = action.payload.key;
      return {$key, ...data}
    });
  }).subscribe(data => this.accelerationValues = data);

感谢大家的关注。

=== [编辑 - 3] ===

(我所做的一切都是假设,因为我从未使用过这个)

在尝试和错误之后,我想我到了某个地方。

现在我有了这个:

this.accelerationValuesRef = this.db.list('/acceleration-values',
  ref => ref.startAt(this.getYesterday())
);

this.accelerationSubscription = this.accelerationValuesRef.snapshotChanges()
 .map(actions => {
   return actions.map(action => {
     const data = action.payload.val();
     const $key = action.payload.key;
     return {$key, ...data}
    });
  }).subscribe(data => this.accelerationValues = data);

注意:'getYesterday()' 是一个返回昨天日期的函数。

我创建了对我的列表(加速度值)的引用,并从给定参数开始。我的问题是:我怎么能说我想引用 'timestamp' 变量?

感谢您的所有关注和时间。

【问题讨论】:

  • 因为它应该相当简单(并且确实需要startAt),所以问题可能在于您如何使用它的细节。您能否更新您的问题以显示您尝试过的代码?
  • @FrankvanPuffelen,我已经尝试了很多东西并删除了尝试其他东西,现在我没有任何关于我如何使用它的解决方案......我已经阅读了文档并尝试复制我的问题没有成功。如果您有可能的解决方案,我想听听。 P.S.:编辑是针对克里斯提出的解决方案,但你同意这一点,你也可以详细说明。无论如何,谢谢你的时间

标签: angular firebase firebase-realtime-database


【解决方案1】:

正如弗兰克所说,这确实是可能的。

您上面显示的数据结构看起来像一个数组,这不起作用。您需要将其存储为地图。您的数据结构可能如下所示:

    movidadomus: {
    - acceleration-values:{
        //Note the different date format, you can't use '/' in a key in firebase
        2017-11-08T01:00:00+01:00: X.XXXX
        2017-11-08T01:00:00+02:00: X.XXXX
        2017-11-08T01:00:00+03:00: X.XXXX
    }
}

那么你可以像这样查询ref.child('movidadomus').child('acceleration-values').orderByKey().startAt('2017-11-08T01:00:00+01:00')

如果您是 firebase 新手,并且刚刚开始使用数据库,我建议您使用他们的新产品 Firestore。除非您需要实时功能(Firestore 在一定程度上仍提供此功能),否则我认为这才是正确的选择。

【讨论】:

    猜你喜欢
    • 2015-11-18
    • 1970-01-01
    • 2015-02-09
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 2023-03-23
    • 2015-12-09
    相关资源
    最近更新 更多