Контекст
В настоящее время я работаю над личным проектом, состоящим из веб-сайта 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, чтобы начать новый запрос для следующей страницы преподавателей
Если я применяю свой методТем не менее, фильтрация тем на стороне клиента удаляет некоторых преподавателей с разных страниц списка и оставляет непоследовательное количество преподавателей на некоторых страницах, поскольку не все преподаватели могут преподавать конкретный предмет.
Единственные варианты, которые я могу придумать, чтобыисправить это так:
Удалить метод запроса orderby () и вообще не иметь возможности упорядочивать мои списки, чтобы попытаться отфильтровать темы, подобные этой
tutorRef.where ("дисциплины", "массив-содержит", "физика 1"). Limit (5)
Разбивать наставников на клиенте, запрашивая всех наставников всбор, который может оказаться очень медленным и тяжелым по запросам пожарных.
Есть какой-то подход к этой проблеме, который я не рассматриваю?