.count 聚合显着减慢了执行时间

问题描述

我正在重构一些旧代码,希望能加快速度并使信息更安全。为此,我尝试使用 MongoDB 聚合框架让所有用户靠近特定位置。最初,这是通过在前端处理一些球面计算来解决的,但这样做会将每个用户lat,lng 坐标发送回前端,这是不安全的,并且不必要地暴露了用户的位置数据。>

我的解决方案是使用聚合框架和 $geoNear获取附近用户的列表,然后还使用名为 distanceAway 的英里距离填充字段。一切正常,直到我尝试设置分页$count 阶段会显着减慢路由的执行速度。

下面是我的代码

module.exports = async function findUsersNearLocationAggregate(baseLocation,page = 1,limit = 20) {
    // quick validation on location object passed
    if(!lodash.get(baseLocation,'geometry.location',undefined)) 
        throw new Error('NO_LOCATION_SPECIFIED')

    //  Grab user location to use as location origin
    const { lat,lng } = baseLocation.geometry.location

    let query = {
        $geoNear: {
            near: { type: "Point",coordinates: [lng,lat] },distanceField: "distanceAway",spherical: true,distanceMultiplier: CONVERT_METERS_TO_MILES
        }
    }

    const users = await User.aggregate([
        query,{ $skip: ((page - 1) * limit) },{ $limit: limit }
    ])

    // const [{ count }] = await User.aggregate([
        // query,// { $count: 'count' }
    // ])

    return {
        user: users,// totalPages: Math.ceil(count / limit)
        // currentPage: page
    }
}

函数旨在返回用户列表(一次 limit 20 个)并显示其他数据(例如 totalPagescurrentPage)以在前面跟踪分页-结束并提出后续请求。

当我注释掉以下行时:

    const [{ count }] = await User.aggregate([
        query,{ $count: 'count' }
    ])

使用调用的路由的执行时间最长为 100 毫秒。 当我在通话中评论跳转到大约 1100 毫秒。

有没有办法在不显着增加请求时间的情况下获得我正在寻找的分页数据? 10X 看起来相当大。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...