查询 2dsphere 索引
在本页面
以下各节描述2dsphere
索引支持的查询。
以多边形为界的 GeoJSON 对象
$geoWithin运算符查询在 GeoJSON 多边形内找到的位置数据。您的位置数据必须以 GeoJSON 格式存储。使用以下语法:
db.<collection>.find( { <location field> :
{ $geoWithin :
{ $geometry :
{ type : "Polygon" ,
coordinates : [ <coordinates> ]
} } } } )
以下示例选择了完全存在于 GeoJSON 多边形内的所有点和形状:
db.places.find( { loc :
{ $geoWithin :
{ $geometry :
{ type : "Polygon" ,
coordinates : [ [
[ 0 , 0 ] ,
[ 3 , 6 ] ,
[ 6 , 1 ] ,
[ 0 , 0 ]
] ]
} } } } )
GeoJSON 对象的交集
$geoIntersects运算符查询与指定的 GeoJSON 对象相交的位置。如果相交为非空,则位置与对象相交。这包括具有共享优势的文档。
$geoIntersects运算符使用以下语法:
db.<collection>.find( { <location field> :
{ $geoIntersects :
{ $geometry :
{ type : "<GeoJSON object type>" ,
coordinates : [ <coordinates> ]
} } } } )
下面的示例使用$geoIntersects选择与coordinates
数组定义的多边形相交的所有索引点和形状。
db.places.find( { loc :
{ $geoIntersects :
{ $geometry :
{ type : "Polygon" ,
coordinates: [ [
[ 0 , 0 ] ,
[ 3 , 6 ] ,
[ 6 , 1 ] ,
[ 0 , 0 ]
] ]
} } } } )
接近 GeoJSON 点
邻近查询返回最接近定义点的点,并按距离对结果进行排序。对 GeoJSON 数据的邻近查询需要2dsphere
索引。
要查询与 GeoJSON 点的接近程度,请使用$near运算符或geoNear命令。距离以米为单位。
$near使用以下语法:
db.<collection>.find( { <location field> :
{ $near :
{ $geometry :
{ type : "Point" ,
coordinates : [ <longitude> , <latitude> ] } ,
$maxDistance : <distance in meters>
} } } )
有关示例,请参见$near。
geoNear命令使用以下语法:
db.runCommand( { geoNear : <collection> ,
near : { type : "Point" ,
coordinates: [ <longitude>, <latitude> ] } ,
spherical : true } )
与$near运算符相比,geoNear命令提供了更多选项并返回了更多信息。要运行该命令,请参见geoNear。
球上定义的圆内的点
要选择球体上“球冠”中的所有网格坐标,请使用$geoWithin和$centerSphere运算符。指定一个包含以下内容的数组:
-
圆心的网格坐标
-
圆的半径,以弧度为单位。要计算弧度,请参见使用球面几何计算距离。
使用以下语法:
db.<collection>.find( { <location field> :
{ $geoWithin :
{ $centerSphere :
[ [ <x>, <y> ] , <radius> ] }
} } )
以下示例查询网格坐标,并返回经度88 W
和纬度30 N
的 10 英里半径内的所有文档。该示例将距离 10 英里转换为弧度,方法是除以地球的大致赤道半径 3963.2 英里:
db.places.find( { loc :
{ $geoWithin :
{ $centerSphere :
[ [ -88 , 30 ] , 10 / 3963.2 ]
} } } )