2016-11-06 151 views
0

我想使用geoNear返回具有经度和纬度坐标的集合中的文档,但即使集合中有经度和纬度坐标的文档也没有得到任何结果。我正在使用mlab来存储我的数据,例如,这里是我的集合中的一个文档。geoNear没有返回任何结果

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

我得到这个结果访问本地主机时:8000/geoFind:

{ 
    "waitedMS": 0, 
    "results": [], 
    "stats": { 
    "nscanned": 0, 
    "objectsLoaded": 0, 
    "maxDistance": 0, 
    "time": 0 
    }, 
    "ok": 1 
} 

现在,我已经尝试了许多不同的方法,如下面却得到,响应errorMongoError:“近”字段必须用点以下:

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返回与纬度和经度坐标文件inates?经度和纬度是否需要以特定的方式存储在数据库中?我尝试了db.command()以及geoNear,并且我总是获取db.command不是一个函数,与trucker.command或trucker.db.db.command或trucker.db.command相同(任何命令都可以从数据库中获取数据数据库,我认为是因为我使用猫鼬不mongoclient,因为我的数据库它与mlab设置)。我已经尝试过没有任何工作,这就是为什么我现在问这个问题,因为我已经尝试了几乎所有可以想象的方式来使用geoNear从我的数据库中获取结果。

+0

MongoDB的地理空间坐标需要被存储为[长, lat],看起来像你正在做[lat,long] - 可能是问题的根源? – pneumee

+0

是的,我没有[long,lat]格式,但我确实尝试过,但仍然没有得到任何结果。不过谢谢你的回答,因为它让我做了更多的测试,然后让geoNear最终返回一些东西! –

回答

1

今天早上我回到了它,做了一些更多的测试,因为它没有任何意义,为什么我没有得到任何结果,所以我创建了一个全新的集合称为位置,并插入了1个文档来测试和它的工作,然后2个文件看起来像下面和工作太:

{ 
    "_id": { 
     "$oid": "581cc2f430c34502e36eb148" 
    }, 
    "truckerID": "b233a9eaaedc63730e71a8b542606ee82e0aa5e5", 
    "name": "Justin", 
    "email": "[email protected]", 
    "company": "Justins Shipping", 
    "user": "justin1", 
    "pass": "D6Mvu6rUur758f37eac7010958c14557bb4df9871a", 
    "phone": "1234567890", 
    "location": [ 
     -73.9928, 
     40.7193 
    ] 
} 

{ 
    "_id": { 
     "$oid": "581cc2f530c34502e36eb158" 
    }, 
    "truckerID": "b233a9eaaedc63731e72a8b542606ee82e0aa7a6", 
    "name": "Alan", 
    "email": "[email protected]", 
    "company": "Alans Shipping", 
    "user": "alan1", 
    "pass": "D6Mvu6fUur758f37eac7010958c14557bb4df9872c", 
    "phone": "1234567890", 
    "location": [ 
     -122.4194155, 
     37.7749295 
    ] 
} 

显然,位置就必须在格式,

location: [longitude, latitude] 

或geoNear将无法找到你文件。

真正有趣的发现对我来说,如果你有一个集合,以10个文件,有您的收藏文件没有:

location: [longitude, latitude] 

geoNear不会得到任何结果要么。如果即使一个文档没有该字段,位置:[经度,纬度],geoNear也将无法找到任何内容,或者在完成一些更多测试后返回任何结果。

在使用猫鼬和mlab进行测试的新集合中创建这2个新文档后,以下工作对我有用。

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": "[email protected]", 
     "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": "[email protected]", 
     "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不返回任何结果行。

编辑:在做了更多的研究之后,实际上是因为集合需要从一开始就创建一个地理空间索引。我尝试将位置字段添加到集合中的所有文档,但仍然无法获得任何结果。一旦我完全删除我的集合在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); 
    } 
});