Решение № 1: Добавить дополнительное поле
Одним из возможных решений было бы добавление дополнительного поля к вашим документам, содержащее только год и месяц, следующим образом:
date:"2020.01.18" (document 1)
searchDate:"2020.01" (document 1)
date: "2020.01.19" (document 2)
searchDate:"2020.01" (document 2)
date: "2020.02.17" (document 3)
searchDate:"2020.02" (document 3)
Затем вы можете легко запросить это поле:
this.afs
.collection("orders", ref => ref.where("searchDate", '==', "2020.02"))
.valueChanges();
}
Дублирование данных таким способом довольно классно c в No SQL World, чтобы упростить / оптимизировать обработку запросов. Он придерживается той же «философии», что и денормализация , которая также является классическим c подходом, как объясняется в этой статье о "методах моделирования данных" для баз данных № 1040 *
Решение № 2: Используйте определенный символ c Unicode для имитации SQL LIKE 'YYYY.MM.%'
Другим решением будет использование комбинации orderBy()
, startAt()
и endAt()
(см. Документацию здесь ) вместе с символом \uf8ff
следующим образом
var searchString = '2020.02.'
this.afs
.collection("orders", ref => ref.orderBy('searchDate')
.startAt(searchString)
.endAt(searchString + '\uf8ff'))
.valueChanges();
}
Фактически, символ \uf8ff
следует за большинством обычных символов в Юникоде, поэтому запрос соответствует всем значениям, которые начинаются с searchString
.
Обратите внимание, что в случае, если вы хотите построить запрос ИЛИ (т.е. все документы, которые имеют дата как «2020.01» ИЛИ как «2020.02»), это невозможно в Firestore, как объяснено в do c. Вам следует «создать отдельный запрос для каждого условия ИЛИ и объединить результаты запроса в вашем приложении».