$near
定义
$near
指定一个点, 地理空间查询将返回从最近到最远的文档。
$near
操作符可以指定GeoJSON点或传统坐标点。$near
需要地理空间索引:要指定一个 GeoJSON 点,
$near
操作符需要一个 2dsphere 索引,语法如下:{ <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 } } )