Сложные запросы в Firestore / База данных в реальном времени и моделирование для запросов - PullRequest
0 голосов
/ 01 мая 2018

У меня проблема с выполнением сложных запросов в базе данных Firestore. Я прочитал документацию бесчисленное количество раз, поэтому я знаю, где есть ограничения, но мне интересно, есть ли способ структурировать данные, чтобы он поддерживал мои варианты использования. Позвольте мне сначала объяснить, какие варианты использования:

У меня есть список заданий, и пользователи, и я хочу иметь возможность просматривать / фильтровать задания по некоторым критериям и просматривать / фильтровать пользователей по некоторым критериям.

Работа

JOB ID
 - job type (1 of predefined values)
 - salary (any number value)
 - location (any value)
   - long
   - lat
 - rating (1 - 5)
 - views (any number value)
 - timeAdded (any timestamp value)
 - etc.

Пользователь

User ID
 - experiences (0, 1 or more of predefined values)
   - experience1
     - jobCategory
     - jobName
     - timeEmployed
   - experience2
     - etc
 - languages (0, 1 or more of predefined values)
   - language1
     - languageName
     - proficency
   - language2
     - etc.
 - location (any value)
   - long
   - lat
 - rating (1 - 5)
 - views (any number value)
 - timeLastActive (any timestamp value)
 - etc.

В порядке фильтрации по полю, которое может иметь только одно значение. Даже когда я добавляю сортировку по "timeAdded" или фильтру Рагне.

1) Проблема в том, что я ввожу фильтр второго диапазона, например, задания с «зарплатой» выше 15 баксов и в то же время с «рейтингом» выше 4. Есть ли способ обойти эту проблему, когда у меня есть N диапазон фильтров?

2) Вторая проблема - я не могу использовать логическое ИЛИ. Скажем, фильтруем задания, где «jobCategory» - это Bartender или Server.

3) Другая проблема заключается в фильтрации по полям, которые могут иметь более одного значения, например Пользователь может говорить более чем на одном языке. Тогда, если я хочу отфильтровать пользователей, которые говорят по-английски, это невозможно. Не говоря уже о фильтрации пользователей, которые говорят, например, Английский или французский.

Я знаю, что могу смоделировать данные так, как я использую язык в качестве имени поля, например -english = true, но когда я добавляю к этому фильтр диапазона, мне нужно создать индекс Firestore, который очень неудобно, поскольку у меня может быть одновременно около 20 языков и около 50 типов заданий, и мне пришлось бы создавать индексы для всех комбинаций вместе с различными фильтрами диапазона. Верно ли это предположение?

4) Как бы я отфильтровал задания на расстоянии до 20 км от определенной позиции? Радиус и положение на выбор пользователя.

5) Что если я хочу фильтровать по всем этим полям одновременно? Например. Отфильтруйте определенную "jobCategory", местоположение и радиус, "зарплату" выше, чем что-то и "рейтинг" выше, чем что-то, и отсортируйте все по "timeAdded".

Возможно ли это с базой данных Firestore / Realtime, могу ли я каким-то образом смоделировать данные, чтобы это поддержать, или мне нужно искать альтернативное решение для БД? Мне действительно нравится аспект в реальном времени. Это пригодится, когда придет время внедрить функцию чата в приложение. Это разрешимо с облачными функциями? Я стараюсь не делать несколько запросов, объединять их и отправлять их клиенту, поскольку может быть любая комбинация фильтров.

Если это невозможно с Firebase, знаете ли вы какие-либо альтернативы, подобные Firestore, с лучшими вариантами запросов? Я действительно надеюсь, что я что-то упустил :)

Спасибо!

...