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);
});
})
我一直在用 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()
:
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);
});
})