Mongoskin 中没有有效的 geoNear 聚合查询 returns

Valid geoNear aggregate query returns nothing in Mongoskin

我一直在用 Express 和 Mongo 皮肤构建一个小型 API。我添加了一个简单的聚合 geoNear 查询来响应给定的参数。服务器 returns 200 并且我没有收到任何错误。我知道我指向正确的集合和所有内容,当我 运行 Mongo 的 shell 中的查询时,它工作正常。代码如下:

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

问题是您在 near 数组中传递请求查询字符串而不是整数,因此尝试首先使用 parseInt():

将它们解析为 return 整数
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);
    });
})

-- 更新 --

来自 OP @JeffLuppes:

Since this works with coordinates it's better to parse them as floats to preserve the full coordinate input. Instead of parseInt() I used 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);
        });
    })