Я пишу Firebase Cloud Function, которая принимает параметр «subject» (например, math et c) и параметр originCoordinate и возвращает список пользователей, упорядоченных по расстоянию от координаты источника.
В настоящее время у меня есть решение для этого:
- Запросить всех пользователей, которые обучают этому предмету
- Рассчитать их расстояние от исходной координаты
- Сортировать результаты по расстоянию
- Возврат 10 пользователей
Это текущая реализация:
let searchResults = []
const originCoordinates = req.params.coordinates
const userCollection = db.collection('users')
const searchQuery = userCollection.where('subjectsTaught', 'array-contains', req.params.subject)
searchQuery.get()
.then(data => {
data.forEach(doc => {
const docData = doc.data()
searchResults.push(
{
"username" : docData.username,
"name" : docData.name,
"description" : docData.description,
"avgRating" : docData.avgRating,
"distance" : calculateDistance(originCoordinates, docData.coordinates),
"avatarUrl": docData.avatarUrl
}
)
// Orders results by distance, returns next 10 records using last username as cursor
searchResults = seek_paginate(searchResults, req.params.lastRecordUsername)
});
return res.json(searchResults);
})
.catch(err => console.error(err));
Проблема в том, что она должна запросить все 1000 математик Преподаватели каждый раз, когда эта функция вызывается, используя много документов для чтения.
Мне было интересно, есть ли лучший способ go сделать это?
Возможно ли как-то перенести этот код в индексы Firestore, чтобы я мог нормально разбивать его на страницы, используя встроенную функцию startAfter ()?