有效的geoNear聚合查询在Mongoskin中不返回任何内容

时间:2015-04-30 08:17:36

标签: node.js mongodb express mongoskin

我一直在Express和Mongoskin中构建一个小API。我添加了一个简单的聚合geoNear查询来响应给定的params。服务器返回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);
});
});

1 个答案:

答案 0 :(得分:0)

问题是你在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);
    });
})

- 更新 -

来自OP @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);
        });
    })