Я создаю API, используя экспресс и мангуст. У меня есть коллекция отзывов, в которой есть поле местоположения, в котором хранится geoJSON. Я пытаюсь запросить свою коллекцию отзывов, используя агрегат и $geoNear.
Вот соответствующая часть из моей схемы обзора:
location: {
type: {
type: String,
default: 'Point'
},
coordinates: {
type: [Number]
}
}
Я также добавил индекс 2дсфера:
ReviewSchema.index({ location: '2dsphere' });
Я могу успешно запросить коллекцию, используя найти и $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.info(err))
});
Синтаксис моего запроса основан на документации mongoDB для $geoNear. Я неправильно использую это с мангустом? Любая помощь очень ценится!
@AnthonyWinzlet Спасибо, Энтони! Это решило проблему.





Проблема в координатах, которые всегда должны быть числовыми, тогда как вы указываете их как String.
Поэтому вместо этого преобразуйте их в целое число или значение с плавающей запятой.
Review.aggregate([{
"$geoNear": {
"near": {
"type": "Point",
"coordinates": [parseFloat(req.params.longitude), parseFloat(req.params.latitude)]
},
"spherical": true,
"maxDistance": 10 * 1609,
"distanceField": "distance"
}
}])
Собираюсь добавить к этому - геокоординаты также должны быть действительными, а запрос - lng, lat - если вы получите их задом наперед или просто укажете неверную координату, вы получите ту же ошибку.
Попробуйте этот
parseFloat(req.params.longitude)и аналогично для широты.