Flutter firebase получает документы, где сегодняшний день находится между полями - диапазон дат (startDate/endDate)

У меня есть несколько документов в моем firestore с "startDate" и "endDate". Теперь я хочу получить каждый документ, в котором сегодняшний день находится между startDate и endDate.

final DateTime dateTime = new DateTime.now();
final QuerySnapshot querySnapshot = await colRef
    .doc(docId)
    .collection('subCol')
    .where('startDate', isLessThanOrEqualTo: dateTime)
    .where('endDate', isGreaterThanOrEqualTo: dateTime)
    .get();

Ошибка очень понятна:

I/flutter ( 5978): 'package:cloud_firestore/src/query.dart': Ошибка утверждение: строка 490 поз. 18: 'hasInequality == field': все, где фильтры с неравенством (<, <=, > или >=) должны быть на одном поле. Но у вас есть фильтры неравенства в «FieldPath ([startDate])» и «Путь к полю ([конечная дата])».

Но должно быть решение моей проблемы без фильтрации на стороне клиента. Возможно ли создать индекс для этого, и если да, то как он выглядит? Другой подход состоял бы в том, чтобы каким-либо образом сохранить диапазон дат в одном поле вместо startDate/endDate, но здесь я бы еще меньше знал, как его фильтровать. Такая простая проблема в SQL, такая сложная в Firebase....

С уважением,

Джейкоб


2 328
1

Ответ:

Решено

Да, "должен быть", но его нет. Вам придется быть немного более практичным. У меня похожая ситуация, но в моем случае я знаю (мой код, мои правила), что события длятся меньше недели. Чтобы уменьшить количество документов, прочитанных в запросе, я фильтрую по

  .where('startDate', isLessThanOrEqualTo: dateTimePlusMaximumEventInterval)
  .where('startDate', isGreaterThanOrEqualTo: dateTimeMinusMaximumEvntInterval)

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

Это связано с тем, как Firestore использует индексы для быстрого разделения результатов и разделения данных таким образом, чтобы они масштабировались.