$near
定义
$near
指定一个点,对于该点,地理空间查询按从近到远的顺序返回文档。地理空间查询返回从最近到最远的文档。运算符
$near
可以指定一个GeoJSON点或旧坐标点。$near
需要一个地理空间索引要指定一个GeoJSON点,运算符
{ <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
需要一个2D索引,并且具有以下语法{ $near: [ <x>, <y> ], $maxDistance: <distance in radians> } 当指定旧坐标时,可以使用可选的
$maxDistance
规范来通过弧度限制$near
结果。$maxDistance
将结果限制在距离中心点最多指定距离的文档。
行为
特殊索引限制
您不能将需要特殊地理空间索引的$near
运算符与需要另一个特殊索引的查询运算符或命令组合。例如,您不能将$near
与$text
查询组合。
排序操作
$near
运算符按距离对文档进行排序。
如果您在查询中使用
sort()
方法,MongoDB将执行第二个排序操作,重新排序匹配的文档。在查询大型集合时,这可能会对查询性能产生负面影响。如果文档的顺序对您不重要,请考虑使用
$geoWithin
运算符,因为它返回未排序的结果。$near
是一个匹配执行运算符,不允许在聚合管道中使用。
验证
从 MongoDB 8.0 开始,$near
、$nearSphere
和 $geoNear
验证指定的 GeoJSON 点 类型必须是 Point
。任何其他输入类型都会返回错误。
示例
查询 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 } } )