У меня есть несколько документов в моем 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....
С уважением,
Джейкоб
Да, "должен быть", но его нет. Вам придется быть немного более практичным. У меня похожая ситуация, но в моем случае я знаю (мой код, мои правила), что события длятся меньше недели. Чтобы уменьшить количество документов, прочитанных в запросе, я фильтрую по
.where('startDate', isLessThanOrEqualTo: dateTimePlusMaximumEventInterval)
.where('startDate', isGreaterThanOrEqualTo: dateTimeMinusMaximumEvntInterval)
(т.е. меньше, чем максимальный интервал событий в будущем, и не больше, чем максимальная продолжительность события в прошлом) ... а затем сделать все остальное локально.
Это связано с тем, как Firestore использует индексы для быстрого разделения результатов и разделения данных таким образом, чтобы они масштабировались.