查询二维索引

在本页面

以下各节描述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> ]的文档。