问题描述
我正在重构一些旧代码,希望能加快速度并使信息更安全。为此,我尝试使用 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 个)并显示其他数据(例如 totalPages
和 currentPage
)以在前面跟踪分页-结束并提出后续请求。
当我注释掉以下行时:
const [{ count }] = await User.aggregate([
query,{ $count: 'count' }
])
使用调用的路由的执行时间最长为 100 毫秒。 当我在通话中评论时跳转到大约 1100 毫秒。
有没有办法在不显着增加请求时间的情况下获得我正在寻找的分页数据? 10X 看起来相当大。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)