查询 2d 索引¶
On this page
接下来描述的是可以被 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 索引 所述。
如果需要在球面上查询位于 “球冠” 内部的普通坐标对,可以使用 $geoWithin 和 $centerSphere 操作符。指定一个包含如下元素的数组:
圆心的网格坐标
以弧度表示的圆半径。可以参见 使用球面几何计算距离 ,查看如何计算弧度。
格式如下:
db.<collection>.find( { <location field> :
{ $geoWithin :
{ $centerSphere : [ [ <x>, <y> ] , <radius> ] }
} } )
如下示例会查询所有网格坐标并返回处于圆内的文档,这个圆以经度 88W 纬度 30N 为圆心,半径 10英里。这个例子将距离10英里转换成了弧度,通过将距离除以地球近似半径3959英里的方式:
db.<collection>.find( { loc : { $geoWithin :
{ $centerSphere :
[ [ 88 , 30 ] , 10 / 3963.2 ]
} } } )
在平面上和点邻近的点¶
Proximity queries return the legacy coordinate pairs closest to the defined point and sort the results by distance. Use either the $near operator or geoNear command. Both require a 2d index.
操作符 $near 格式如下:
db.<collection>.find( { <location field> :
{ $near : [ <x> , <y> ]
} } )
参见 $near 了解更多例子。
命令 geoNear 格式如下:
db.runCommand( { geoNear: <collection>, near: [ <x> , <y> ] } )