Angularfire2查询时间戳

时间:2017-11-08 11:45:11

标签: angular firebase firebase-realtime-database

我是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
    }
  }

我需要在时间戳'时获得加速对象。等于或大于某个值。

我在angular and 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);

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

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

感谢您的关注和时间。

1 个答案:

答案 0 :(得分:0)

弗兰克提到这确实是可能的。

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

    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仍然提供这种功能),否则这就是我认为的方式。