Фильтруйте большую коллекцию эффективным способом - PullRequest
0 голосов
/ 07 февраля 2020

Я работаю над приложением вроде uber, у меня есть коллекция драйверов с 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();
  }
}

, а затем с запросом публикации с текущим положением пользователя на нем

     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
        });

, если у нас большой массив драйверов, который не будет очень эффективным, если есть другой способ?

1 Ответ

1 голос
/ 08 февраля 2020

Вы можете использовать $geoNear с aggregate, чтобы добиться этого из самого запроса и не загружать все драйверы, а затем выполнить этот фильтр в javascript

См. Этот код

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

Вы должны хранить текущую позицию драйверов в вашей схеме следующим образом

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