按用户ID和日期查询Firebase>现在()

时间:2017-10-07 15:57:18

标签: javascript angular firebase firebase-realtime-database

所以我的数据结构如下所示:

enter image description here

因此,为了显示用户预订,我需要uIDdate

进行查询
return this.firebase.database.list('/reservations', {
  query: {
    orderByChild: 'uID',
    equalTo: uID
  }
});

如何将date字段添加到我的查询中,使其大于当前日期?

1 个答案:

答案 0 :(得分:0)

问题是一次只能查询一个字段的实时数据库。所以要走的路可能是:

  • 在日期上运行查询并返回谁有效;
  • 在每次预订时添加一个字段 - uID_dateValid,其中包含uid字符串,只是添加了有效字段 - KGHFHJKJ_VALID
  • 现在只需对新添加的字段运行查询并将结果返回给您的组件。

所以在你的情况下它会是这样的:

const dateValid$ = this.firebase.database.list('/reservations', {
  var currentTime = new Date().getTime();
  query: {
    orderByChild: 'date',
    startAt: currentTime
  }
});

// just to note - you might not need three rows like you have now - 
// "date", "dateTime", "time". You can save one row where value is a 
// timestamp, like in my variable "currentTime" above.

dateValid$.map(items => items.map(item => {
  var key = item.$key;
  var uID_dateValid = item.uID + '_VALID';
  dataToSave[`reservations/${key}/uID_dateValid`] = uID_dateValid;
  return this.firebaseUpdate(dataToSave);
})).subscribe();

现在你可以查询并返回:

return this.firebase.database.list('/reservations', {
  var valid = uID + '_VALID'; 
  query: {
    orderByChild: 'uID_dateValid',
    equalTo: valid
  }
});

可能存在一些语法或次要的逻辑错误,但这个想法很清楚。

其他方式是,只需查询数据库两次,获取两个列表并在客户端过滤它们。

还有一种方法可能是查询两次,获取这两个Observable,找到匹配的记录并返回这些键的Observable,但在流的上下文中我有点不确定如何做到这一点..