Поэтому моя структура данных выглядит так:
Поэтому, чтобы отображать пользовательские заказы, мне нужно запросить uID
и date
return this.firebase.database.list('/reservations', {
query: {
orderByChild: 'uID',
equalTo: uID
}
});
Как добавить поле date
в мой запрос больше, чем текущая дата?
Проблема в том, что база данных Realtime может запрашиваться только по одному полю за раз. Таким образом, путь:
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 из этих ключей, но в контексте потоков я немного не уверен, как это можно сделать.
"uID_date": "L6Vgg...Jj2_2017-07-03"
. Для примера этого и других подходов, смотрите мой ответ здесь: stackoverflow.com/questions/26700924/…