查询二维索引
在本页面
以下各节描述2d
索引支持的查询。
在平面上定义的形状内的点
要选择在给定形状的平面上找到的所有旧坐标对,请使用$geoWithin运算符和形状运算符。使用以下语法:
db.<collection>.find( { <location field> :
{ $geoWithin :
{ $box|$polygon|$center : <coordinates>
} } } )
以下查询在左下角的[ 0 , 0 ]
和右上角的[ 100 , 100 ]
定义的矩形内的文档。
db.places.find( { loc :
{ $geoWithin :
{ $box : [ [ 0 , 0 ] ,
[ 100 , 100 ] ]
} } } )
以下查询以[ -74 , 40.74 ]
为中心,半径为10
的圆内的文档:
db.places.find( { loc: { $geoWithin :
{ $center : [ [-74, 40.74 ] , 10 ]
} } } )
有关每种形状的语法和示例,请参见以下内容:
球上定义的圆内的点
由于遗留原因,MongoDB 在平面2d
索引上支持基本的球形查询。通常,球形计算应使用2dsphere
索引,如2dsphere Indexes中所述。
要查询球体上“球冠”中的旧坐标对,请使用$geoWithin和$centerSphere运算符。指定一个包含以下内容的数组:
-
圆心的网格坐标
-
圆的半径,以弧度为单位。要计算弧度,请参见使用球面几何计算距离。
使用以下语法:
db.<collection>.find( { <location field> :
{ $geoWithin :
{ $centerSphere : [ [ <x>, <y> ] , <radius> ] }
} } )
以下示例查询返回位于经度88 W
和纬度30 N
的 10 英里半径内的所有文档。该示例通过将距离除以大约 3963.2 英里的地球赤道半径来将距离转换为弧度:
db.<collection>.find( { loc : { $geoWithin :
{ $centerSphere :
[ [ 88 , 30 ] , 10 / 3963.2 ]
} } } )
接近平面上的一点
邻近查询返回最接近定义点的传统坐标对,并按距离对结果进行排序。使用$near运算符或geoNear命令。两者都需要2d
索引。
$near运算符使用以下语法:
db.<collection>.find( { <location field> :
{ $near : [ <x> , <y> ]
} } )
有关示例,请参见$near。
geoNear命令使用以下语法:
db.runCommand( { geoNear: <collection>, near: [ <x> , <y> ] } )
与$near运算符相比,geoNear命令提供了更多选项并返回了更多信息。要运行该命令,请参见geoNear。
在平面上完全匹配
您不能使用2d
索引来返回坐标对的精确匹配。在存储坐标的字段上使用标量(升序或降序)索引以返回完全匹配项。
在下面的示例中,如果您有{ 'loc': 1}
索引,则find()操作将返回位置上的完全匹配项:
db.<collection>.find( { loc: [ <x> , <y> ] } )
该查询将返回任何值为[ <x> , <y> ]
的文档。