Docs 主页 → 开发应用程序 → MongoDB Manual
$near
定义
$near
指定地理空间查询返回从最近到最远的文档的点。
$near
操作符可以指定GeoJSON点或传统坐标点。$near
需要地理空间索引:如果指定了 GeoJSON 点 , 则为 2dsphere 索引,
如果使用传统坐标指定了点,则为 2d 索引。
要指定GeoJSON点,
$near
操作符需要2 dsphere索引,并具有以下语法:{ <location field>: { $near: { $geometry: { type: "Point" , coordinates: [ <longitude> , <latitude> ] }, $maxDistance: <distance in meters>, $minDistance: <distance in meters> } } } 重要
如果指定纬度和经度坐标,则先列出经度,然后列出纬度。
有效经度值介于
-180
和180
之间,两者均包括在内。有效纬度值介于
-90
和90
之间,两者均包括在内。
指定 GeoJSON 点时,可以使用 可选 的
$minDistance
和 规范按距离(以$maxDistance
$near
米 为单位)限制 结果:$minDistance
会将结果限制为与中心点至少相距指定距离的文档。$maxDistance
将结果限制那些距离中心点最多指定距离的文档。
要使用传统坐标指定点,
$near
需要2 d索引,语法如下:{ $near: [ <x>, <y> ], $maxDistance: <distance in radians> } 指定传统坐标时,可以使用 可选
$maxDistance
的 规范,通过以$near
弧度为单位 的距离来限制 结果。$maxDistance
将结果限制为与中心点相距不 超过 指定距离的文档。
行为
特殊索引限制
不能将需要特殊$near
地理空间索引 的 操作符与需要其他特殊索引的查询操作符或命令组合使用。例如,您不能将$near
与$text
查询结合使用。
分片集合
从 MongoDB 4开始。分片集合支持0 、 $near
查询。
在早期 MongoDB 版本中,分片集合不支持$near
查询;相反,对于分片集群,您必须使用$geoNear
聚合阶段或geoNear
命令(在 MongoDB 4 . 0及更早版本中可用)。
排序操作
$near
操作符按距离对文档进行排序。
如果您在查询中使用了
sort()
方法,MongoDB 会再一次执行排序操作,对匹配的文档重新排序。查询大型集合时,这可能会对查询性能产生负面影响。如果文档的顺序对您来说并不重要,可以考虑改用
$geoWithin
操作符,因为该操作符会返回未排序的结果。$near
是一种匹配执行操作符,不允许在聚合管道中使用。
举例
GeoJSON 数据查询
重要
如果指定纬度和经度坐标,则先列出经度,然后列出纬度。
有效经度值介于
-180
和180
之间,两者均包括在内。有效纬度值介于
-90
和90
之间,两者均包括在内。
考虑一个有 2dsphere
索引的集合 places
。
以下示例返回距指定 GeoJSON 点至少 1000
米、至多 5000
米的文档(按从最近到最远排序):
db.places.find( { location: { $near : { $geometry: { type: "Point", coordinates: [ -73.9667, 40.78 ] }, $minDistance: 1000, $maxDistance: 5000 } } } )
查询传统坐标
重要
如果指定纬度和经度坐标,则先列出经度,然后列出纬度。
有效经度值介于
-180
和180
之间,两者均包括在内。有效纬度值介于
-90
和90
之间,两者均包括在内。
考虑一个有 2d
索引的集合 legacy2d
。
以下示例将返回距指定传统坐标对最多 0.10
弧度的文档(按从最近到最远的顺序排序):
db.legacy2d.find( { location : { $near : [ -73.9667, 40.78 ], $maxDistance: 0.10 } } )