Javascript 在Firebase中按距离排序的搜索结果分页

Javascript 在Firebase中按距离排序的搜索结果分页,javascript,firebase,google-cloud-firestore,pagination,google-cloud-functions,Javascript,Firebase,Google Cloud Firestore,Pagination,Google Cloud Functions,我正在编写Firebase Cloud函数,它接受一个“subject”(例如:math等)参数和“originCoordinate”参数,并返回一个用户列表,这些用户按与原始坐标的距离排序 目前,我的解决方案是: 查询教授该科目的所有用户 计算它们与原点坐标的距离 按距离对结果排序 返回10个用户 这是当前的实施方式: let searchResults = [] const originCoordinates = req.params.coordinates const userColle

我正在编写Firebase Cloud函数,它接受一个“subject”(例如:math等)参数和“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名数学导师,占用了大量的文档读取

    我想知道是否有更好的方法来做这件事


    是否有可能以某种方式将此代码传输到Firestore的索引中,以便我可以使用内置的startAfter()函数对其进行正常分页?

    如果您想在云函数中使用Firestore分页,则必须安排客户端在调用
    startAfter()时发送所需的值。没有简单的方法可以解决这个问题-客户端需要通知后端如何获取所需的数据页