Запрос Firebase по идентификатору пользователя и дате> NOW ()

1

Поэтому моя структура данных выглядит так:

Изображение 174551

Поэтому, чтобы отображать пользовательские заказы, мне нужно запросить uID и date

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

Как добавить поле date в мой запрос больше, чем текущая дата?

  • 1
    Я думаю, что было бы лучше, если бы вы сохранили свою дату в метке времени таким образом, вы сохранили 2 поля в вашей БД и, конечно же, в своем ответе.
  • 0
    Запросы к базе данных Firebase Realtime могут упорядочивать / фильтровать только по одному свойству. Во многих случаях можно объединить значения, которые вы хотите отфильтровать, в одно (синтетическое) свойство, например, "uID_date": "L6Vgg...Jj2_2017-07-03" . Для примера этого и других подходов, смотрите мой ответ здесь: stackoverflow.com/questions/26700924/…
Показать ещё 1 комментарий
Теги:
angular
firebase
firebase-realtime-database

1 ответ

0
Лучший ответ

Проблема в том, что база данных 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 из этих ключей, но в контексте потоков я немного не уверен, как это можно сделать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню