geoNear

在本页面

Definition

  • geoNear
    • 从最近到最远按指定点的接近程度返回文档。 geoNear需要地理空间索引。

geoNear命令接受包含以下字段的document。以与文档坐标系相同的单位指定所有距离:

FieldTypeDescription
geoNearstring要查询的集合。
nearGeoJSON 点或传统坐标对查找最近文档的点。


如果使用2dsphere索引,则可以将点指定为 GeoJSON 点或旧版坐标对。
如果使用2d索引,则将该点指定为旧坐标对。
| spherical |布尔值|如果使用2dsphere索引则为必需。确定 MongoDB 如何计算距离。默认值为false
如果true,则如果指定的(near)点是 GeoJSON 点,则 MongoDB 将使用球形几何来计算距离,如果指定的(near)点是旧式坐标对,则 MongoDB 将使用弧度来计算距离。
如果为false,则 MongoDB 使用 2d 平面几何来计算点之间的距离。
如果使用2dsphere索引,则spherical必须是true
| limit |数字|可选。返回的最大文件数。默认值为100。另请参见num选项。
| num |数字|可选。 num选项提供的功能与limit选项相同。两者都定义了要返回的最大文档数。如果同时包含两个选项,则num值将覆盖limit值。
| minDistance |数字|可选。 必须离文件中心点的最小距离。 MongoDB 将结果筛选到距中心点至少*指定距离的那些文档。
仅可用于2dsphere索引。
如果指定的点是GeoJSON,则以米为单位指定距离;如果指定的点是传统坐标对,则以弧度指定距离。
2.6 版中的新功能。
| maxDistance |数字|可选。 可以距文件中心点的最大距离。 MongoDB 将结果限制为距中心点指定距离内的那些文档。
如果指定的点是GeoJSON,则以米为单位,如果指定的点是传统坐标对,则以弧度为单位。
| query |文档|可选。将结果限制为与查询匹配的文档。查询语法是常用的 MongoDB 读取操作查询语法。
您不能在geoNear命令的query字段中指定$near谓词。
| distanceMultiplier |数字|可选。将查询返回的所有距离相乘的因子。例如,使用distanceMultiplier通过乘以地球半径将球形查询返回的弧度转换为公里。
| includeLocs |布尔值|可选。如果为true,则查询返回结果中匹配文档的位置。默认值为false。当位置字段包含多个位置时,此选项很有用。要在嵌入式文档中指定字段,请使用dot notation
| uniqueDocs |布尔值|可选。如果此值为true,则即使文档的多个位置字段与查询匹配,查询也会返回一次匹配的文档。
从 2.6 版开始不推荐使用:地理空间查询不再返回重复的结果。 $uniqueDocs运算符对结果没有影响。|
| readConcern |文档|可选。指定read concern
readConcern 选项具有以下语法:
在版本 3.6 中更改。
readConcern: { level: <value> }
可能的阅读关注级别为:
"local"。这是默认的阅读关注级别。
"available"。当未指定读取操作和因果一致的会话和“ level”时,这是针对次要对象的读取的默认值。查询返回实例的最新数据。
"majority"。可用于使用WiredTiger 存储引擎的副本集。
"linearizable"。仅可用于primary上的读取操作。
有关阅读关注级别的更多信息,请参阅阅读关注级别
对于"local"(默认)或"majority"读关注级别,您可以指定afterClusterTime选项以使读操作返回满足级别要求和在群集时间之后指定的数据。有关更多信息,请参见读取操作和因果一致的会话

Considerations

geoNear需要geospatial index

但是,geoNear命令要求一个集合最多*仅具有一个2dsphere和/或只有一个2d index

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

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

Command Syntax

2dsphere Index

如果使用2dsphere索引,则可以为near值指定GeoJSON点或旧式坐标对。

您必须在语法中包含spherical: true

对于spherical: true,如果您指定一个 GeoJSON 点,则 MongoDB 使用米作为度量单位:

db.runCommand( {
   geoNear: <collection> ,
   near: { type: "Point" , coordinates: [ <coordinates> ] } ,
   spherical: true,
   ...
} )

对于spherical: true,如果您指定一个传统坐标对,则 MongoDB 使用弧度作为度量单位:

db.runCommand( {
   geoNear: <collection> ,
   near: [ <coordinates> ],
   spherical: true,
   ...
} )

2d Index

要查询2d索引,请使用以下语法:

db.runCommand( {
   geoNear: <collection>,
   near : [ <coordinates> ],
   ...
} )

如果指定spherical: true,则 MongoDB 将使用球面几何来计算弧度距离。否则,MongoDB 将使用平面几何来计算点之间的距离。

Behavior

geoNear按距离对文档进行排序。如果还为查询包括sort(),则sort()重新排序匹配的文档,从而有效地覆盖geoNear已经执行的排序操作。将sort()与地理空间查询一起使用时,请考虑使用$geoWithin运算符,该运算符不对文档进行排序,而不是geoNear

由于geoNear从最近到最远排序文档,因此minDistance字段有效地跳过了前* n 个文档,其中 n *由距离要求决定。

geoNear命令提供了$near运算符的替代方法。除了$near的功能之外,geoNear还返回其他诊断信息。

sharded cluster中,geoNear命令可以返回orphaned documents。为了避免这种情况,请考虑使用$geoNear聚合阶段作为替代方案。

Examples

以下示例在具有2dsphere索引的集合places上运行geoNear命令。

指定查询条件

以下geoNear命令查询category等于"public"的文档,并以最接近最远到指定点的 Sequences 返回匹配的文档:

db.runCommand(
   {
     geoNear: "places",
     near: { type: "Point", coordinates: [ -73.9667, 40.78 ] },
     spherical: true,
     query: { category: "public" }
   }
)

该操作返回以下输出,即从最近到最远的results中的文档:

{
  "results" : [
     {
       "dis" : 0,
       "obj" : {
          "_id" : 2,
          "location" : { "type" : "Point", "coordinates" : [ -73.9667, 40.78 ] },
          "name" : "Central Park",
          "category" : "public"
       }
     },
     {
       "dis" : 3245.988787957091,
       "obj" : {
          "_id" : 3,
          "location" : { "type" : "Point", "coordinates" : [ -73.9836, 40.7538 ] },
          "name" : "Bryant Park",
          "category" : "public"
       }
     },
     {
       "dis" : 7106.506152782733,
       "obj" : {
          "_id" : 4,
          "location" : { "type" : "Point", "coordinates" : [ -73.9928, 40.7193 ] },
          "name" : "Sara D. Roosevelt Park",
          "category" : "public"
       }
     },

  ],
  "stats" : {
     "nscanned" : NumberLong(47),
     "objectsLoaded" : NumberLong(47),
     "avgDistance" : 3450.8316469132747,
     "maxDistance" : 7106.506152782733,
     "time" : 4
  },
  "ok" : 1
}

指定 minDistance 和 maxDistance

以下示例指定3000米的minDistance7000米的maxDistance

db.runCommand(
   {
     geoNear: "places",
     near: { type: "Point", coordinates: [ -73.9667, 40.78 ] },
     spherical: true,
     query: { category: "public" },
     minDistance: 3000,
     maxDistance: 7000
   }
)

该操作返回以下输出:

{
  "results" : [
     {
       "dis" : 3245.988787957091,
       "obj" : {
          "_id" : 3,
          "location" : { "type" : "Point", "coordinates" : [ -73.9836, 40.7538 ] },
          "name" : "Bryant Park",
          "category" : "public"
       }
     }
  ],
  "stats" : {
      "nscanned" : NumberLong(11),
      "objectsLoaded" : NumberLong(11),
      "avgDistance" : 3245.988787957091,
      "maxDistance" : 3245.988787957091,
      "time" : 0
  },
  "ok" : 1
}

覆盖默认读取问题

要覆盖默认的阅读关注级别"local",请使用readConcern选项。

对副本集的以下操作指定Read Concern"majority"来读取已确认已写入大多数节点的数据的最新副本。

Note

从 MongoDB 3.6 开始,默认情况下启用对读取关注"majority"的支持。对于 MongoDB 3.6.1-3.6.x,您可以禁用阅读关注"majority"。有关更多信息,请参见禁用多数阅读关注

  • 无论read concern级别如何,节点上的最新数据都可能无法反映系统中数据的最新版本。
db.runCommand(
   {
      geoNear: "places",
      near: { type: "Point", coordinates: [ -73.9667, 40.78 ] },
      spherical: true,
      query: { category: "public" },
      readConcern: { level: "majority" }
   }
)

为确保单个线程可以读取其自己的写入,请对副本集的主数据库使用"majority"读取关注和"majority"写入关注。

Output

geoNear命令返回包含以下字段的文档:

  • geoNear. results

    • 具有geoNear命令结果的数组,按距离排序,最接近的结果列在最前,最远的列在最后。
  • geoNear.results[n]. dis

    • 对于结果中的每个文档,其与geoNear命令中定义的坐标的距离。
  • geoNear.results[n]. obj

    • 集合中的文档。
  • geoNear. stats

    • 具有有关查询的统计信息的对象,用于返回geoNear搜索的结果。
  • geoNear.stats. nscanned

    • 数据库操作期间扫描的索引条目的总数。
  • geoNear.stats. objectsLoaded

    • 数据库操作期间从磁盘读取的文档总数。
  • geoNear.stats. avgDistance

    • geoNear命令中定义的坐标与作为结果返回的文档的坐标之间的平均距离。
  • geoNear.stats. maxDistance

    • geoNear命令中定义的坐标与作为结果返回的文档的坐标之间的最大距离。
  • geoNear.stats. time

    • 数据库操作的执行时间,以毫秒为单位。
  • geoNear. ok

    • 1表示geoNear搜索成功。值0表示错误。