2017-10-07 186 views
1

所以我的数据结构是这样的:火力地堡查询NOW()

enter image description here

因此,为了显示我需要uIDdate

return this.firebase.database.list('/reservations', { 
    query: { 
    orderByChild: 'uID', 
    equalTo: uID 
    } 
}); 
查询用户预订

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

+1

我认为如果以这种方式将日期保存在时间戳中,会更好。您可以在数据库中保存2个字段,当然也可以在响应中保存 –

+0

Firebase实时数据库查询只能对单个属性进行排序/过滤。在许多情况下,可以将要过滤的值合并到单个(合成)属性中,例如''uID_date“:”L6Vgg ... Jj2_2017-07-03“'。有关此方法和其他方法的示例,请参阅此处的答案:http://stackoverflow.com/questions/26700924/query-based-on-multiple-where-clauses-in-firebase –

+0

您应该以一种格式存储日期允许查询它们。这意味着您可以将它们作为时间戳存储,就像@arkgast所说的那样,或者以允许词典排序的字符串格式存储它们。 “2017-07-03T19:30:00Z”。另请参阅我的答案在这里:https://stackoverflow.com/questions/38216858/firebase-query-by-date-string –

回答

0

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

  • 对日期运行查询并返回谁的有效;在新增加的字段KGHFHJKJ_VALID
  • 现在只需运行查询并返回结果给您的组件 -
  • 在每一个预约添加更多的领域 - uID_dateValid,是以UID字符串,只是增加了有效的吧。

所以你的情况会是这样的:

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 
    } 
}); 

可能有一些语法或轻微的逻辑错误,但这个想法很清楚。

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

而另一种方式可能是查询两次,得到这两个观测量,找到匹配的记录,并返回可观察那些键,但在流之间的关系,我有点不确定如何可以这样做..