我正在使用uber之类的应用程序工作,我有一组驱动程序,具有currentPosition {latitude,longitutde}

我想使驾驶员远200m,我做到的方式就像在模型上这样:

driverSchema.methods.CloseDriver = function (userCurrentPosition,next) {
  try {
    const distance = geolib.getPreciseDistance(
      userCurrentPosition,
      this.currentPosition
   );
   return distance <= 200
  } catch (error) {
      return next();
  }
}


然后使用用户的currentPosition进行发布请求

     const parsedBody = Object.setPrototypeOf(req.body, {});

      if(parsedBody.hasOwnProperty("latitude") && parsedBody.hasOwnProperty("longitude")){
        const { latitude , longitude } = req.body
        const currentPosition = { latitude , longitude }
        const drivers = await Driver.find({})
        const eligibleDrivers =  drivers.filter((driver)=> driver.CloseDriver(currentPosition))
        return res.status(200).json({
          status : 200 ,
          eligibleDrivers
        });


如果我们有大量的驱动程序,如果还有另一种方法,效率会不是很高?

最佳答案

您可以将$geoNearaggregate结合使用来从查询本身中实现此目的,而不必加载所有驱动程序,然后在javascript中进行此过滤

看到这个代码

db.drivers.aggregate([
   {
     $geoNear: {
        near: { type: "Point", coordinates: [ CurrentLongitude, CurrentLatitude ] },
        distanceField: "distance",
        maxDistance: 2,
        includeLocs: "currentPosition",
        spherical: true
     }
   }
]);


您必须像这样在模式中存储驱动程序的currentPosition latlang

"currentPosition": {
      "type" : "Point",
      "coordinates" : [ -73.9375, 40.8303 ]
   },

09-20 20:49