Допустимый агрегатный запрос 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);
        });
    })
Другие вопросы по тегам