Как я могу отфильтровать по дате и местоположению в пожарном депо? - PullRequest
2 голосов
/ 12 октября 2019

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

Поскольку мы не можем использовать несколько операций «массива». в одном запросе я попробовал хорошо известный «трюк с картой» в Firestore, но теперь, когда я добавил порядок в запрос, это больше не вариант.

let usersQuery = firestore.collection('Users')
                        .where('availableInAreaCodes.12345', '==', true)
                        .where('availableOnDates.2019-10-20', '==', true)
                        .orderBy('level', 'asc');

Любые идеи?

Ответы [ 2 ]

1 голос
/ 13 октября 2019

Спасибо @DougStevenson и @FrankvanPuffelen за вашу помощь.

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

Примечание:Это решение может не подходить для вашего сценария.

Я добавил новую коллекцию «Доступность» для каждого пользовательского документа и разделил данные о доступности на недели года (старые документы удаляются каждую неделю, ановый добавляется каждую неделю).

Я добавил areaCodes в виде массива, каждый день недели в качестве поля и сокращенный набор пользовательских данных в документах.

Мне пришлось создать всего44 составных индекса (11 полей * 4 упорядоченных комбинации). Максимальное количество Firestore - 200 для каждой базы данных.

В моем сценарии оно того стоило, поскольку этот запрос является ключевой особенностью приложения.

let usersQuery = firestore.collectionGroup('Availability')
                        .where('areaCodes', 'array-contains', 'DE-1234')
                        .where('weekYear', '==', '2019-W42'))
                        .where('monday', '==', 'available')
                        .orderBy('userPreview.level', 'asc'
0 голосов
/ 12 октября 2019

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

availableInAreaCodesOnDates:
  ["12345_2019-10-20", "94110_2019-10-20"]

Затем вы можете запросить это с помощью одного оператора массива.

...