Между StartDate и EndDate Firestore - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть документы с startDate и endDate.Я хотел бы сделать запрос между диапазонами startDate и endDate.Я могу запросить диапазон для одной даты следующим образом:

whereField("startDate", isGreaterThan: start).whereField("startDate, isLessThan: end)

Но я не могу запросить два поля, например, так:

whereField("startDate", isGreaterThan: start).whereField("endDate", isLessThan: end)

Firestore пропускает исключение при использовании более чем одного поля всоставное где утверждение.

1 Ответ

1 голос
/ 03 апреля 2019

Независимо от того, какую платформу вы используете для создания своего приложения, я уверен, что полученная вами ошибка является довольно явной. Официальная документация Cloud Firestore также довольно явно относится к этой теме. Таким образом, существуют некоторые ограничения запроса , когда дело доходит до Firestore:

Cloud Firestore не поддерживает следующие типы запросов:

  • Логические ИЛИ запросы. В этом случае вы должны создать отдельный запрос для каждого условия ИЛИ и объединить результаты запроса в вашем приложении.

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

Чтобы решить эту проблему, вы можете выбрать одно из следующих решений:

  • Вы можете выполнить фильтрацию для одного ( первое ) поля в запросе и для другого (второго) поля на стороне клиента, как также указывается в официальной документации.

  • Вы можете каким-то образом объединить значения двух диапазонов в одно поле, что позволяет использовать ваш вариант использования с одним полем. Очень удачным примером такой комбинации было бы использование геохэш для фильтрации по свойствам широты и долготы, как Франк Ван Пуффелен очень хорошо объяснил в этом видео, Опрос Firebase и Firestore .

  • Другой вариант - изменить способ хранения данных и смоделировать их по-другому. Самая простая реализация - поместить все элементы в пределах startDate и endDate в одну коллекцию. Поскольку вы не выбрали тег для платформы, я напишу необходимый запрос в Javascript, но он может быть написан просто для других языков программирования. Таким образом, вы можете запросить эту коллекцию с помощью следующего запроса:

    db.collection("startDate-endDate").where('date','>=', start).where('date','<=', end);
    
  • Другой, еще более общий вариант - хранить все ваши предметы в коллекции для каждого необходимого вам периода (год, месяц или день), а затем выполнять необходимое количество запросов для получения искомых предметов. за одну из каждой коллекции itemsFromFirstYear, itemsFromSecondYear и т. д.

Пожалуйста, ознакомьтесь также с официальной документацией относительно:

ИМХО, я бы порекомендовал подобрать первый вариант.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...