Я нашел решение этой проблемы.
Для исходного запроса требовался составной индекс из трех полей.Таким образом, существует только одно сравнение диапазонов на date
- contentType
используется только для проверки на равенство - и два порядка на date
и response.like
, оба из которых составляют составной индекс.
Вместо этого я решил добавить поле в документ contents
следующим образом:
{
tags: string[]; // the new field.
date: Timestamp;
contentType: string;
response: {
like: Number;
};
}
И новый запрос выглядит так:
Firestore.firestore()
.collection(path: .contents)
.whereField(.tags, arrayContains: Date.getDatabaseKey())
.whereField(.contentType, isEqualTo: "basic")
.order(by: likeKey, descending: true)
.limit(to: Constant.fetchLimit)
(Date.getDatabaseKey()
просто создает строку yyyy-MM-dd
на основе текущей даты.)
Для этого запроса требуется два составных индекса:
tags Arrays response.like Descending
и contentType Ascending response.like Descending
.
К счастью, это работает как брелок.
Добавлена информация Исходный запрос проверил коллекцию на наличие документов, созданных после 5 часов утра определенного дня, и мне показалось, что проверка диапазона была проблемой.
Пока вышеописанный метод Date.getDatabaseKey()
генерирует ключ с тем же днем для часов с 5:00:00 до 4: 59: 59 следующего дня , этот новый запрос имеетв основном тот же эффект.