Разбивка результатов поиска по расстоянию в Firebase - PullRequest
0 голосов
/ 04 февраля 2020

Я пишу Firebase Cloud Function, которая принимает параметр «subject» (например, math et c) и параметр originCoordinate и возвращает список пользователей, упорядоченных по расстоянию от координаты источника.

В настоящее время у меня есть решение для этого:

  1. Запросить всех пользователей, которые обучают этому предмету
  2. Рассчитать их расстояние от исходной координаты
  3. Сортировать результаты по расстоянию
  4. Возврат 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 ()?

1 Ответ

0 голосов
/ 04 февраля 2020

Если вы хотите использовать разбиение на страницы Firestore в облачных функциях, вам нужно будет договориться, чтобы клиент отправил значения, требуемые при вызове, на startAfter(). Нет простого способа обойти это - клиент должен сообщить бэкэнду о том, как получить нужную страницу данных.

...