$geoNear (aggregation)

在本页面

Definition

  • $geoNear
    • 以距指定点最近到最远的 Sequences 输出文档。

$geoNear阶段具有以下原型形式:

{ $geoNear: { <geoNear options> } }

$geoNear运算符接受包含以下$geoNear选项的document。以与已处理文档的坐标系相同的单位指定所有距离:

FieldTypeDescription
sphericalboolean如果使用2dsphere索引,则为必需。确定 MongoDB 如何计算距离。默认值为false


如果true,则如果指定的(near)点是 GeoJSON 点,则 MongoDB 将使用球形几何来计算距离,如果指定的(near)点是旧式坐标对,则 MongoDB 将使用弧度来计算距离。
如果为false,则 MongoDB 使用 2d 平面几何来计算点之间的距离。
如果使用2dsphere索引,则spherical必须是true
| limit |数字|可选。返回的最大文件数。默认值为100。另请参见num选项。
| num |数字|可选。 num选项提供的功能与limit选项相同。两者都定义了要返回的最大文档数。如果同时包含两个选项,则num值将覆盖limit值。
| maxDistance |数字|可选。 可以距文件中心点的最大距离。 MongoDB 将结果限制为距中心点指定距离内的那些文档。
如果指定的点是GeoJSON,则以米为单位,如果指定的点是传统坐标对,则以弧度为单位。
| query |文档|可选。将结果限制为与查询匹配的文档。查询语法是常用的 MongoDB 读取操作查询语法。
您不能在$geoNear阶段的query字段中指定$near谓词。
| distanceMultiplier |数字|可选。将查询返回的所有距离相乘的因子。例如,使用distanceMultiplier通过乘以地球半径将球形查询返回的弧度转换为公里。
| uniqueDocs |布尔值|可选。如果此值为true,则即使文档的多个位置字段与查询匹配,查询也会返回一次匹配的文档。
从 2.6 版开始不推荐使用:地理空间查询不再返回重复的结果。 $uniqueDocs运算符对结果没有影响。|
| near | GeoJSON 点或传统坐标对 |要查找最近文档的点。
如果使用2dsphere索引,则可以将点指定为 GeoJSON 点或旧版坐标对。
如果使用2d索引,则将该点指定为旧坐标对。
| distanceField | string |包含计算出的距离的输出字段。要在嵌入式文档中指定字段,请使用dot notation
| includeLocs | string |可选。这指定了标识用于计算距离的位置的输出字段。当位置字段包含多个位置时,此选项很有用。要在嵌入式文档中指定字段,请使用dot notation
| minDistance |数字|可选。距文档中心点的最小距离。 MongoDB 将结果限制为距中心点超出指定距离的那些文档。
为 GeoJSON 数据指定距离(以米为单位),为旧坐标对指定距离(以弧度为单位)。
版本 3.2 中的新功能。

Behavior

使用$geoNear时,请考虑:

  • 您只能将$geoNear用作管道的第一阶段。

  • 您必须包含distanceField选项。 distanceField选项指定将包含计算出的距离的字段。

  • $geoNear需要geospatial index

  • $geoNear要求一个集合最多一个2d index和/或仅一个2dsphere index

  • 您无需指定文档中的哪个字段包含坐标对或点。由于$geoNear要求集合具有单个地理空间索引,因此$geoNear隐式使用索引字段。

  • 如果使用2dsphere index,则必须指定spherical: true

  • 您不能在$geoNear阶段的query字段中指定$near谓词。

  • Views不支持 geoNear 操作(即geoNear命令和$geoNear管线阶段)

通常,$geoNear的选项与geoNear命令相似,但以下情况除外:

  • distanceField$geoNear管道运算符的必填字段;该选项在geoNear命令中不存在。

  • includeLocs$geoNear管道运算符中接受string,在geoNear命令中接受boolean

Example

考虑具有2dsphere索引的集合places。以下汇总最多找到5个唯一文档,这些文档的位置距中心[ -73.99279 , 40.719296 ]最多 2 米,并且type等于public

db.places.aggregate([
   {
     $geoNear: {
        near: { type: "Point", coordinates: [ -73.99279 , 40.719296 ] },
        distanceField: "dist.calculated",
        maxDistance: 2,
        query: { type: "public" },
        includeLocs: "dist.location",
        num: 5,
        spherical: true
     }
   }
])

聚合返回以下内容:

{
   "_id" : 8,
   "name" : "Sara D. Roosevelt Park",
   "type" : "public",
   "location" : {
      "type" : "Point",
      "coordinates" : [ -73.9928, 40.7193 ]
   },
   "dist" : {
      "calculated" : 0.9539931676365992,
      "location" : {
         "type" : "Point",
         "coordinates" : [ -73.9928, 40.7193 ]
      }
   }
}

匹配的文档包含两个新字段:

  • dist.calculated包含计算出的距离的字段,以及

  • dist.location字段,其中包含计算中使用的位置。

Minimum Distance

3.2 版中的新功能。

下面的示例使用选项minDistance来指定距文档中心点的最小距离。 MongoDB 将结果限制为距中心点超出指定距离的那些文档。

db.places.aggregate([
   {
     $geoNear: {
        near: { type: "Point", coordinates: [ -73.99279 , 40.719296 ] },
        distanceField: "dist.calculated",
        minDistance: 2,
        query: { type: "public" },
        includeLocs: "dist.location",
        num: 5,
        spherical: true
     }
   }
])