On this page
geoNear
在本页面
Definition
geoNear
- 从最近到最远按指定点的接近程度返回文档。 geoNear需要地理空间索引。
geoNear命令接受包含以下字段的document。以与文档坐标系相同的单位指定所有距离:
Field | Type | Description |
---|---|---|
geoNear |
string | 要查询的集合。 |
near |
GeoJSON 点或传统坐标对 | 查找最近文档的点。 |
如果使用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命令要求一个集合最多*仅具有一个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
米的minDistance
和7000
米的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
- 要使用read concern级别"majority",副本集必须使用WiredTiger 存储引擎和选举协议版本 1。
从 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
表示错误。
- 值