Допустимый агрегатный запрос geoNear ничего не возвращает в Mongoskin
Я строил небольшой API в Express и Mongoskin. Я добавил простой агрегированный запрос geoNear, чтобы ответить на заданные параметры. Сервер возвращает 200, и я не получаю ошибку. Я знаю, что указываю на правильную коллекцию и все такое, и когда я запускаю запрос в оболочке Mongo, он работает нормально. Код ниже:
app.get('/collections/:collectionName/geonear', function(req, res, next) {
req.collection.aggregate([
{
"$geoNear": {
"near": [req.query.lng, req.query.lat],
"distanceField": "distance"
}
},
{
"$sort": {"distance": -1}
}
],
function(e, results) {
res.send(results);
});
});
1 ответ
Решение
Проблема в том, что вы передаете строки запроса в вашем near
массив вместо целых чисел, поэтому попробуйте разобрать их, чтобы сначала получить целые числа, используя parseInt()
:
app.get('/collections/:collectionName/geonear', function(req, res, next) {
var lng = parseInt(req.query.lng),
lat = parseInt(req.query.lat);
req.collection.aggregate(
[
{
"$geoNear": {
"near": [lng, lat],
"distanceField": "distance"
}
},
{
"$sort": {"distance": -1}
}
],
function(e, results) {
res.send(results);
});
})
- ОБНОВЛЕНИЕ -
Из ОП @JeffLuppes:
Так как это работает с координатами, лучше проанализировать их как плавающие, чтобы сохранить полный ввод координат. Вместо parseInt() я использовал parseFloat().
Пересмотренное решение заключается в использовании parseFloat()
:
app.get('/collections/:collectionName/geonear', function(req, res, next) {
var lng = parseFloat(req.query.lng),
lat = parseFloat(req.query.lat);
req.collection.aggregate(
[
{
"$geoNear": {
"near": [lng, lat],
"distanceField": "distance"
}
},
{
"$sort": {"distance": -1}
}
],
function(e, results) {
res.send(results);
});
})