Спасибо @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'