Нужна рекомендация по фильтрации, разбивке на страницы и упорядочению данных из базы - PullRequest
0 голосов
/ 24 мая 2019

Контекст

В настоящее время я работаю над личным проектом, состоящим из веб-сайта ReactJS, который показывает список преподавателей, которые можно фильтровать различными способами, взаимодействуя с различными компонентами.Я сделал компонент, который берет массив информации о преподавателе из коллекции пожарного магазина, предназначенной для информации о преподавателе, а затем отображает ее в виде списка.Поля каждого документа в коллекции преподавателей, которые могут быть отфильтрованы прямо сейчас, представляют собой массив тем, содержащий имена различных предметов, поле цены, описывающее почасовую оплату, и поле фамилии.В дополнение к фильтрации, преподаватели могут быть отсортированы по фамилии в алфавитном порядке и от самой низкой до самой высокой почасовой ставки.

Я могу фильтровать все эти вещи без проблем, хотя я должен выполнить предметную фильтрацию на стороне клиента.Это связано с тем, что если я упорядочу данные в алфавитном порядке по полю фамилии или по числовому полю в виде цены, используя метод orderBy () для ссылки на коллекцию, я не смогу добавить запрос where () для поиска в другом поле.Например, если я хочу сделать запрос к firebase, который возвращает снимок репетиторов по порядку по фамилии ученика, а также хочет, чтобы ученики, которые не преподают физику, отфильтровывались, мне нужно было бы написать такой запрос:

tutorRef.orderBy("lastname").where("subjects", "array-contains", "Physics 1")

Но это выдает ошибку.Согласно документам Firestore , это связано с тем, что при использовании orderBy в определенном поле последующие операторы where () также должны использоваться в том же поле.Чтобы решить эту проблему, я полностью удалил оператор where ()

tutorRef.orderBy("lastname")

и написал функцию, которая перебирает массив возвращенной информации о преподавателе и удаляет любого преподавателя, у которого нет субъекта, указанного компонентом фильтра.в массиве предмета преподавателя.

Вот как выглядит метод для этого, если это помогает.

getTutors = (filterType) => {

    var wholeData = [];

    // Get all tutors from tutors collection in firebase
    var query = db.collection("tutors")

    // Order by a custom filterType, such as "lastname" or "price"
    query = query.orderBy(filterType)
    query.get().then(snapshot => {
      // Push individual tutor information from snapshot to array
      snapshot.forEach(doc => {
        wholeData.push(doc.data());
      })

      // If the current subject filter value is "No selection then don't filter, 
      // otherwise do filter by subject
      if (this.state.subjectFilterValue != 'No selection') {
        wholeData = wholeData.filter((tutor) => {
          return tutor.info.subjectnames.includes(this.state.subjectFilterValue)
        })
      }

      // Filter out tutors that aren't in the filter price range
      wholeData = wholeData.filter((tutor) => {
        return (tutor.info.price >= this.state.minPrice &&
          tutor.info.price <= this.state.maxPrice) ||
          tutor.info.price == -1
      })

      // store tutor data in state
      this.setState({
        tutors: wholeData
      })
    }).catch(error => {
      console.log('something gone bad:', error);
    })
}

Задача

Я хочу реализоватьнумерация страниц и показывать только пять репетиторов одновременно.Для этого потребуется изменить запрос на

tutorRef.orderBy("lastname").where("subjects", "array-contains", "Physics 1").limit(5)

, затем взять последний документ из этого запроса и использовать startAfter, чтобы начать новый запрос для следующей страницы преподавателей

Если я применяю свой методТем не менее, фильтрация тем на стороне клиента удаляет некоторых преподавателей с разных страниц списка и оставляет непоследовательное количество преподавателей на некоторых страницах, поскольку не все преподаватели могут преподавать конкретный предмет.

Единственные варианты, которые я могу придумать, чтобыисправить это так:

  1. Удалить метод запроса orderby () и вообще не иметь возможности упорядочивать мои списки, чтобы попытаться отфильтровать темы, подобные этой

    tutorRef.where ("дисциплины", "массив-содержит", "физика 1"). Limit (5)

  2. Разбивать наставников на клиенте, запрашивая всех наставников всбор, который может оказаться очень медленным и тяжелым по запросам пожарных.

Есть какой-то подход к этой проблеме, который я не рассматриваю?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...