我有一个存储位置数量的文档。我的目标是找到特定纬度和长度之间的所有位置。我现在的做法并不是非常有效。我获取所有位置并在for循环中过滤它们。我想使用$ range方法。
locationsCollection.find({}).toArray(function(err, results){
var locations = [];
for(var key in results){
if(
results[key].latitude > req.query.latitude - latitudeOffset &&
results[key].latitude < req.query.latitude + latitudeOffset &&
results[key].longitude > req.query.longitude - longitudeOffset &&
results[key].longitude < req.query.longitude + longitudeOffset
)
locations.push({
location: results[key].location,
latitude: results[key].latitude,
longitude: results[key].longitude
});
}
res.json({error: false, locations: locations});
});
答案 0 :(得分:1)
您可以使用MongoDB geospatial query。
这样做MongoDB允许您使用GeoJSON objects工作,2dsphere index是使用JSON描述位置数据的标准。
例如,我有一系列地点:
expect(link.props.to).toEqual('/toto')
> db.test.find()
{ "_id": 0, "loc": { "type": "Point", "coordinates": [ 1, 1 ] } }
{ "_id": 1, "loc": { "type": "Point", "coordinates": [ 2, 2 ] } }
{ "_id": 2, "loc": { "type": "Point", "coordinates": [ 20, 20 ] } }
然后我想找到哪个位置在特定的&#34;框中,使用geodesy进行描述:
> db.test.createIndex({loc: '2dsphere'})
结果是:
> db.test.find({
loc: {
$geoWithin: {
$geometry: {
type: 'Polygon',
coordinates: [ [ [0,0], [3,6], [6,1], [0,0] ] ]
}
}
}
})
其中显示坐标为{ "_id": 0, "loc": { "type": "Point", "coordinates": [ 1, 1 ] } }
{ "_id": 1, "loc": { "type": "Point", "coordinates": [ 2, 2 ] } }
的位置位于查询中的边界框之外。
注意:根据{{3}},MongoDB的地理空间查询遵循地球的曲率。也就是说,当处理使用[20, 20]
索引的查询时,会考虑地球的曲率。大多数地图是投射到平面2d平面的球体,因此看起来像2d中的直线,不会是球体中的直线。
注意:GeoJSON的坐标系顺序为2dsphere
,与典型(纬度,经度)对相反。