2017-02-21 4 views
1

В базе данных Firebase У меня есть список Заказы.Выберите из базы данных Firebase, используя несколько условий, где условия

Каждый бронирование в следующей структуре

{ 
    userUid: string, 
    status: string, 
    moreStuff: { 
    .... 
    } 
} 

мне нужно выбрать все заказы, связанные с определенным пользователем (т.е. чей userUid равна UID пользователя, который является известные по приложению), которые имеют определенный статус (например, status = confirmed).

Я могу выбрать заказы, относящиеся к конкретному пользователю, используя следующий запрос

db.list('bookings', { 
     query: { 
      orderByChild: 'userUid', 
      equalTo: user.uid 
     } 
    }) 

, но я понятия не имею, если я могу добавить дополнительное условие выбора, например, status = confirmed

+0

Запросы базы данных Firebase могут только заказывать/фильтровать на одном объекте. Вы можете комбинировать значения, которые вы хотите фильтровать, в одном свойстве. См. Http://stackoverflow.com/questions/26700924/query-based-on-multiple-where-clauses-in-firebase. Кроме того, вы можете моделировать данные, чтобы разрешить запрос. Например, это похоже на проблему категоризации на первый взгляд, которую я здесь рассмотрел: http://stackoverflow.com/questions/40656589/firebase-query-if-child-of-child-contains-a-value –

ответ

1

В запросе firebase вы не можете фильтровать более одного поля. Я неоднократно сталкивался с этим ограничением.

Я думаю, что ваш вызов станет проще, если вы будете моделировать свои данные по-разному. Я считаю, что у вас есть отношения друг к другу между пользователями и заказами. То есть у пользователя может быть много заказов, но при бронировании может быть только один пользователь. Если это так, я бы создал узел верхнего уровня «bookingLists», который содержит отдельный список бронирования для каждого пользователя. Структура показана ниже. Путь "bookingList/< userId>" содержит список бронирования для данного пользователя. Вы можете получить доступ к списку, если знаете userId. Он будет содержать все заказы для этого пользователя. Затем вы можете запросить в одном поле в каждом бронировании для фильтрации.

bookingLists 
    <userId> 
    bookings 
     <bookingKey> 
      status 
      ...other fields 

Если вам необходимо дополнительно отфильтровать бронирование, вы можете фильтровать на стороне клиента с помощью наблюдаемой карты операций и фильтра. Это будет масштабироваться, если каждый пользователь не имеет слишком большого списка бронирования.

+0

Спасибо. Очистить. Еще один вопрос. Не является ли ограничение одного поля для фильтра большей частью ограничений использования Firebase в средних и сложных приложениях? В моем случае решение, которое вы предлагаете, работает, но если я изменю критерии (например, я хочу «ожидающие» заказы в течение определенного месяца), я должен будет фильтровать на стороне клиента (как вы предлагаете). – Picci

+1

Да, это большое ограничение. Но есть обходные пути, такие как объединение полей или фильтрация на стороне клиента. Но его все еще очень неудобно. Но, согласно команде Firebase, это необходимое условие для реального масштабирования. В моем случае я использую Firebase не для его масштабирования, а прежде всего для своей природы в реальном времени и безсерверной модели. Я обнаружил, что могу жить с ограничениями. –