Есть ли обходной путь для ограниченных возможностей запросов firebase

#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. Вместо этого вы можете перенести часть фильтрации в клиентское приложение. Итак, вы можете применить фильтр диапазона, который удаляет большую часть документов, а затем попросить клиентское приложение удалить все остальное, что нежелательно.

Возможно, вы можете ускорить этот процесс, если серверная часть сделает запрос и дополнительно отфильтрует результаты перед отправкой их обратно клиенту. Это сэкономит время, необходимое для передачи нежелательных документов.