MongoDB查询对象,其坐标适合某个范围

时间:2018-03-14 22:30:48

标签: javascript node.js mongodb

我有一个存储位置数量的文档。我的目标是找到特定纬度和长度之间的所有位置。我现在的做法并不是非常有效。我获取所有位置并在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});
});

1 个答案:

答案 0 :(得分:1)

您可以使用MongoDB geospatial query

这样做

MongoDB允许您使用GeoJSON objects工作,2dsphere index是使用JSON描述位置数据的标准。

例如,我有一系列地点:

expect(link.props.to).toEqual('/toto')

使用特殊GeoJSON's polygon object

> 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,与典型(纬度,经度)对相反。