ближнее поле должно быть точкой - PullRequest
0 голосов
/ 03 февраля 2019

Я строю API, используя экспресс и мангуст.У меня есть коллекция обзоров, которая имеет поле местоположения, в котором хранится geoJSON.Я пытаюсь запросить мою коллекцию отзывов, используя aggregate и $ geoNear .

Вот соответствующая часть из моей ReviewSchema:

location: { 
    type: { 
      type: String, 
      default: 'Point'
    },
    coordinates: { 
      type: [Number] 
    } 
  }

Я также добавил 2dsphere index:

ReviewSchema.index({ location: '2dsphere' });

Я могу успешно запросить коллекцию, используя find и $ nearSphere :

router.get('/:longitude/:latitude/:dist', (req, res) => {
  Review.find({
    location: {
     $nearSphere: {
       $geometry: {
         type: 'Point',
         coordinates: [req.params.longitude, req.params.latitude]
       },
       $maxDistance: req.params.dist * 1609.34
     }
   }
  })
  .then(reviews => res.json(reviews))
});

При попытке использовать агрегат и $ geoNear, однако, я получаю сообщение об ошибке:
'Ближним полем должна быть точка'

Вот маршрут с запросом:

router.get('/:longitude/:latitude', (req, res) => {
  Review.aggregate([{
     $geoNear: {
       near: {
         type: "Point",
         coordinates: [req.params.longitude, req.params.latitude]
       },
       spherical: true,
       maxDistance: 10 * 1609,
       distanceField: 'distance'
     }
   }])
   .then(reviews => res.json(reviews))
   .catch(err => console.log(err))
});

Синтаксис для моего запроса основан на документации mongoDB для $ geoNear.Я неправильно использую это с мангустом?Любая помощь очень ценится!

1 Ответ

0 голосов
/ 04 февраля 2019

Проблема связана с координатами, которые всегда должны быть числовыми, в то время как вы указали его как String

Так что вместо этого конвертируйте их в целочисленные значения или значения с плавающей запятой

Review.aggregate([{
  "$geoNear": {
    "near": {
      "type": "Point",
      "coordinates": [parseFloat(req.params.longitude), parseFloat(req.params.latitude)]
    },
    "spherical": true,
    "maxDistance": 10 * 1609,
    "distanceField": "distance"
  }
}])
...