用有效的方式过滤大 collection

Filter large collection with an efficient way

我正在开发像优步这样的应用程序,我有 collection 名司机, currentPosition { latitude , longitutde }

而且我想让车手远离 200 米,我在模型上的做法是这样的:

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

然后使用 post 请求,其中包含用户的 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 ]
   },