我尝试使用geoNear返回集合中具有纬度和经度坐标的文档,但是即使集合中存在具有纬度和经度坐标的文档,也不会得到任何结果。我正在使用mlab来存储我的数据,例如,我的集合中有一个文档。
var trucker = db.collection('trucker');
{
"_id": {
"$oid": "581e82d00f192a694bb56679"
},
"latitude": 77.0551642746301,
"longitude": 10.825842664395019,
"loc": [
77.0551642746301,
10.825842664395019
],
}我有两种不同方式的坐标,因为我试图查看geoNear是否会拾取位置并返回结果,但仍然找不到它。这就是我目前使用geoNear查找结果的方法
exports.geoNear = function (lat, lon ,res, next)
{
console.log("Inside geoNear");
var job = {};
job.lon = JSON.parse(lon);
job.lat = JSON.parse(lat);
console.log(job.lon);
console.log(job.lat);
trucker.geoNear([job.lon, job.lat], function(err, success){
if(success) {
res(success);
} else {
console.log('Response error' + err);
}
});
};
app.get('/geoFind', function(req, res) {
AM.geoNear('48.99759239999999', '-123.0683089', function(o){
res.send(200,o);
});
});当我访问localhost:8000/geoFind时,我得到了这个结果:
{
"waitedMS": 0,
"results": [],
"stats": {
"nscanned": 0,
"objectsLoaded": 0,
"maxDistance": 0,
"time": 0
},
"ok": 1
}现在,我已经尝试了许多不同的方法,比如下面的方法,但是get,Response errorMongoError:'near‘字段必须是指向如下的字段:
trucker.createIndex( { loc : "2dsphere" } )
trucker.geoNear({loc: {type: "Point", coordinates: [job.lon,job.lat]}}, {spherical: true}, function(err, success) {
if(success){
res(success);
} else {
console.log('Response error '+err + job.lon +':' + job.lat);
}
});现在,我想知道如何使用geoNear返回带有纬度和经度坐标的文档?纬度和经度是否需要以特定的方式存储在数据库中?我也尝试了db.command()和geoNear,我总是得到db.command不是一个函数,与trucker.command或trucker.db.db.command或trucker.db.command一样(任何使用命令从数据库获取数据的东西,我认为这是因为我使用的是mongoose而不是mongoclient,因为我的数据库是用mlab设置的)。我尝试过的所有方法都没有起作用,这就是为什么我现在问这个问题,因为我已经尝试了几乎所有能想到的方法来使用geoNear从我的数据库中获得结果。
发布于 2016-11-08 05:59:08
今天早上我又做了一些测试,因为我不明白为什么我没有得到任何结果,所以我创建了一个名为location的全新集合,并插入了一个文档进行测试,它可以工作,然后是两个文档,看起来像下面的,也可以工作:
{
"_id": {
"$oid": "581cc2f430c34502e36eb148"
},
"truckerID": "b233a9eaaedc63730e71a8b542606ee82e0aa5e5",
"name": "Justin",
"email": "Justin@gmail.com",
"company": "Justins Shipping",
"user": "justin1",
"pass": "D6Mvu6rUur758f37eac7010958c14557bb4df9871a",
"phone": "1234567890",
"location": [
-73.9928,
40.7193
]
}
{
"_id": {
"$oid": "581cc2f530c34502e36eb158"
},
"truckerID": "b233a9eaaedc63731e72a8b542606ee82e0aa7a6",
"name": "Alan",
"email": "Alan@gmail.com",
"company": "Alans Shipping",
"user": "alan1",
"pass": "D6Mvu6fUur758f37eac7010958c14557bb4df9872c",
"phone": "1234567890",
"location": [
-122.4194155,
37.7749295
]
}显然,位置必须是这样的格式,
location: [longitude, latitude] 否则geoNear将无法找到您的文档。
对我来说,真正有趣的发现是,如果你有一个集合,有10个文档,而集合中有一些文档没有:
location: [longitude, latitude] geoNear也不会得到任何结果。如果一个文档没有这个字段,location:经度,纬度,geoNear也不能找到任何东西,或者在做了一些进一步的测试后返回任何结果。
在使用mongoose和mlab为测试目的在新集合中创建了这两个新文档后,下面的方法对我很有效。
exports.geoNear = function (lon, lat ,res, next)
{
console.log("Inside geoNear");
var job = {};
job.lon = JSON.parse(lon);
job.lat = JSON.parse(lat);
console.log(job.lon);
console.log(job.lat);
locations.geoNear([job.lon, job.lat], {spherical: true}, function(err, success){
if(success) {
res(success);
} else {
console.log('Response error' + err);
}
});
}
var AM = require('./modules/account-manager');
app.get('/geoFind', function(req, res) {
AM.geoNear('-73.99279', '40.719296', function(o){
res.send(200,o);
});
});我得到了以下结果:
{
"waitedMS": 0,
"results": [
{
"dis": 1.4957325341976439e-7,
"obj": {
"_id": "581cc2f430c34502e36eb148",
"truckerID": "b233a9eaaedc63730e71a8b542606ee82e0aa5e5",
"name": "Justin",
"email": "Justin@gmail.com",
"company": "Justins Shipping",
"user": "justin1",
"pass": "D6Mvu6rUur758f37eac7010958c14557bb4df9871a",
"phone": "1234567890",
"location": [
-73.9928,
40.7193
]
}
},
{
"dis": 0.6482546796756842,
"obj": {
"_id": "581cc2f530c34502e36eb158",
"truckerID": "b233a9eaaedc63731e72a8b542606ee82e0aa7a6",
"name": "Alan",
"email": "Alan@gmail.com",
"company": "Alans Shipping",
"user": "alan1",
"pass": "D6Mvu6fUur758f37eac7010958c14557bb4df9872c",
"phone": "1234567890",
"location": [
-122.4194155,
37.7749295
]
}
}
],
"stats": {
"nscanned": 24,
"objectsLoaded": 2,
"avgDistance": 0.3241274146244688,
"maxDistance": 0.6482546796756842,
"time": 6
},
"ok": 1
}我希望这个答案能帮助其他同样想知道为什么geoNear没有返回任何结果的人。
编辑:在做了更多的研究之后,实际上是因为集合需要从get-go创建地理空间索引。我尝试将location字段添加到集合中的所有文档,但仍然无法获得任何结果。一旦我在mlab中完全删除了我的名为"trucker“的集合,并重新添加它,我终于能够搜索该索引并获得结果。
最初需要这一行:
trucker.createIndex( { location : "2dsphere" } )然后,您可以使用geoNear查找您所在位置附近的用户,如下所示:
trucker.geoNear([job.lon, job.lat], {maxDistance:5000, distanceMultiplier: 6378137, spherical: true}, function(err, success){
if(success) {
res(success);
} else {
console.log('Response error' + err);
}
});https://stackoverflow.com/questions/40450614
复制相似问题