#firebase #google-cloud-firestore
#firebase #google-cloud-firestore
Вопрос:
Я создаю приложение для знакомств, которое использует множество фильтров. Вот запрос:
findMatch(itinerary: IItinerary): void {
const findMatchQuery = this.matchSvc.getMyMatch()
.where('location', '==', itinerary.location)
.where('endDay', '>=', itinerary.startDay)
.where('gender', '==', itinerary.searchGender);
findMatchQuery.get()
.then(listSnapshot => {
this.matches = [];
listSnapshot.forEach(async snapshot => {
let age = moment().diff(snapshot.data().dateOfBirth, 'years');
if ((snapshot.data().startDay <= itinerary.endDay) amp;amp; (!this.dontShowList.includes(snapshot.id))) {
if ((age <= itinerary.ageRange.upper) amp;amp; (age >= itinerary.ageRange.lower) amp;amp; (snapshot.id !== itinerary.id)) {
this.matches.push({
snapshot.data(),
photoUrl: await this.getUserPhoto(snapshot.data().userId)
});
}
}
});
});
}
Я понимаю, что то, что я здесь делаю, нехорошо, но я не знаю другого способа сделать это, потому что вы не можете использовать более одного оператора неравенства.
Я должен использовать (‘endDay’, ‘>=’, route.startDay), но мне также нужно фильтровать по возрасту, поэтому я использую оператор if, подобный so, для фильтрации по возрасту:
пусть age = moment().diff(snapshot.data().DateOfBirth, ‘годы’);
если ((возраст <= маршрут.возрастной диапазон.верхний) amp;amp; (возраст> = маршрут.возрастной диапазон.ниже)
это делается для того, чтобы убедиться, что я добавляю в список только пользователей, которые попадают в желаемый возрастной диапазон. Я хотел бы иметь возможность ограничить свой запрос на 1, и когда пользователь проводит пальцем влево или вправо, затем снова запрашивает firebase, чтобы получить другого пользователя. Я не могу ограничить, потому что я использую операторы if вне запроса для дальнейшей фильтрации списка на основе желаемого поиска пользователя.
Допустим, у меня есть ограничение в 5 от firebase. Но тогда ни один из 5 пользователей не попадает в возрастной диапазон. С точки зрения firebase у меня есть 5 пользователей … firebase не знает, что эти 5 были дополнительно отфильтрованы с помощью оператора if, а список пользователей пуст. Мне нужно, чтобы весь мой запрос принимал все действующие фильтры, если я могу использовать опцию limit(), чтобы мне не приходилось извлекать каждую запись из firebase.
И в дополнение к возрастным фильтрам я фактически фильтрую диапазон дат…но опять же, я могу использовать только один оператор неравенства в запросе. Итак, у меня есть оператор if и для следующего: if ((snapshot.data().startDay <= маршрут.конечный день)
Итак, что я здесь делаю, так это ищу диапазон дат. Это то, что я хотел бы сделать:
.where('location', '==', itinerary.location)
.where('endDay', '>=', itinerary.startDay)
.where('gender', '==', itinerary.searchGender)
.where('startDay', '<=', itinerary.endDay)
.where('age', '>=', itinerary.minimumAge)
.where('age', '<=', itinerary.maximumAge);
Очевидно, что я не могу использовать приведенный выше запрос, и я использую операторы if для дальнейшей фильтрации, но я думаю, что нет способа использовать функцию limit() с учетом этих операторов if, но я подумал, что сначала спрошу на всякий случай.
Спасибо
Ответ №1:
Если у вас нет какого-либо способа объединить все запросы диапазона в одно поле, вы не сможете обойти ограничения запросов Firestore. Вместо этого вы можете перенести часть фильтрации в клиентское приложение. Итак, вы можете применить фильтр диапазона, который удаляет большую часть документов, а затем попросить клиентское приложение удалить все остальное, что нежелательно.
Возможно, вы можете ускорить этот процесс, если серверная часть сделает запрос и дополнительно отфильтрует результаты перед отправкой их обратно клиенту. Это сэкономит время, необходимое для передачи нежелательных документов.