翻译或纠错本页面

查询 2d 索引

接下来描述的是可以被 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> ] } )

命令 geoNear$near 相比,可以有更多的选项,且返回更多的信息。 geoNear 查看命令详情。

在平面上的准确匹配

在 2.6 版更改: 在此之前, 2d 索引支持准确匹配坐标的查询

您不能使用 2d 索引来准确匹配坐标对。您可以在存储坐标的键上建立递增或者递减的索引,然后使用这个索引来返回需要的精确匹配数据。

下例中 find() 操作将会返回位置的精确匹配,如果您有 { 'loc': 1} 索引的话:

db.<collection>.find( { loc: [ <x> , <y> ] } )

这个查询会返回所有(位置)值为 [ <x> , <y> ] 文档。