Firestore позволяет объединить несколько методов where () для создания более специфических запросов, но только для одного и того же поля. Как вы, вероятно, можете видеть в официальной документации относительно Ограничения запроса :
Cloud Firestore не поддерживает следующие типы запросов:
- Запросы с фильтрами диапазона в различных полях, как описано в предыдущем разделе.
Так что фильтры диапазона на разных полях запрещены.
Чтобы достичь того, что вы хотите, вам нужно дважды запросить базу данных, один раз, чтобы сопоставить данные с помощью вызова:
.whereGreaterThanOrEqualTo("dateFrom", startDate)
А во-вторых, используя вызов:
.whereLessThanOrEqualTo("dateTo", endDate)
Но, к сожалению, вы не можете использовать их в одном запросе.
Изменить:
Когда мы разрабатываем схему базы данных, в основном мы структурируем ее для наших запросов. Таким образом, помимо вышеупомянутого решения, в котором вы можете фильтровать одно поле в запросе и другое поле в коде на стороне клиента, существует также другой подход, в котором вы можете объединить значения двух диапазонов в одно поле в каким-то образом, который позволит использовать ваш вариант с одним полем.
Один из самых удачных примеров, которые я видел до сих пор, - это комбинация, используемая в Geohashes
для фильтрации по широте и долготе, как объяснил Фрэнк ван Пуффелен в следующем видео:
Зная разницу в усилиях между этими двумя решениями, я бы порекомендовал использовать первое.
Существует также третье решение, в котором вы должны добавить все задачи с марта по апрель в одну коллекцию. Затем вы можете запросить эту новую коллекцию с помощью:
db.collection("tasks-aps-mar")
.whereGreaterThanOrEqualTo("day", 1)
.whereLessThanOrEqualTo("day", 30);
Еще более общим решением было бы сохранить задачи в коллекции для каждого месяца, а затем выполнить запрос, чтобы получить все задачи, соответствующие желаемому месяцу. В вашем случае вы должны запросить базу данных, чтобы получить документы в одной из каждой коллекции tasks-mar-2019
, tasks-apr-2019
, tasks-may-2019
и т. Д.
Что касается вашего комментария, использование массивов вам совсем не поможет, поскольку вы не можете использовать интервалы диапазона.