参考 > 地理空间查询
MongoDB支持对地理空间数据的查询操作。本节介绍MongoDB的地理空间功能。
在MongoDB中,您可以将地理空间数据存储为GeoJSON对象或旧式坐标对。
要在类似地球的球体上计算几何形状,请将位置数据存储为GeoJSON对象。
要指定GeoJSON数据,请使用具有以下内容的嵌入式文档:
一个名称字段type
,用于指定GeoJSON对象类型和
一个coordinates
指定对象坐标的字段。
如果指定纬度和经度坐标,请先列出经度,然后再列出 纬度:
-180
和之间180
,包括两者之间。-90
和之间90
,包括在内。例如,要指定GeoJSON Point:
有关MongoDB支持的GeoJSON对象的列表以及示例,请参阅GeoJSON对象。
对GeoJSON对象的MongoDB地理空间查询是在球体上计算的;MongoDB使用WGS84参考系统对GeoJSON对象进行地理空间查询。
要计算欧几里得平面上的距离,请将您的位置数据存储为旧坐标对并使用2d索引。通过将数据转换为GeoJSON Point类型,MongoDB支持通过2dsphere索引对旧坐标对进行球面计算。
要将数据指定为旧版坐标对,可以使用数组(首选)或嵌入式文档。
如果指定纬度和经度坐标,请先列出经度,然后再列出 latitude;即
-180
和之间180
,包括两者之间。-90
和之间90
,包括在内。如果指定纬度和经度坐标,则第一个字段(无论字段名称如何)都必须包含经度值,第二个字段必须包含纬度值;即
-180
和之间180
,包括两者之间。-90
和之间90
,包括在内。为了指定旧式坐标对,数组优先于嵌入式文档,因为某些语言不保证关联地图的排序。
MongoDB提供以下地理空间索引类型以支持地理空间查询。
2dsphere
¶2dsphere索引支持查询,该查询可计算 类似地球的球体上的几何形状。
要创建2dsphere
索引,请使用
db.collection.createIndex()
方法并指定字符串文字"2dsphere"
作为索引类型:
其中,是一个字段,其值可以是
GeoJSON对象或旧式坐标对。<location field>
有关2dsphere
索引的更多信息,请参见
2dsphere索引。
2d
¶2d索引支持在二维平面上计算几何的查询
。尽管索引可以支持$nearSphere
在球体上进行计算的查询,但如果可能,请对球面查询使用 2dsphere索引。
要创建2d
索引,请使用db.collection.createIndex()
方法,将location字段指定为键,并将字符串文字指定
"2d"
为索引类型:
其中,是一个字段,其值为旧式坐标对。<location field>
有关2d
索引的更多信息,请参见2d索引。
分片集合时,不能将地理空间索引用作分片键。但是,可以通过使用其他字段作为分片键在分片集合上创建地理空间索引。
分片集合支持以下地理空间操作:
$geoNear
聚集阶段$near
和$nearSphere
查询运算符(从MongoDB 4.0开始)开始在MongoDB中4.0,$near
和$nearSphere
查询都支持分片集合。
在早期版本的MongoDB,$near
并$nearSphere
查询不支持分片的集合; 相反,对于分片群集,必须使用$geoNear
聚合阶段或geoNear
命令(在MongoDB 4.0及更低版本中可用)。
您还可以使用$geoWithin
和查询分片群集的地理空间数据
$geoIntersect
。
注意
对于球形查询,请使用2dsphere
索引结果。
将2d
索引用于球形查询可能会导致错误的结果,例如将2d
索引用于环绕两极的球形查询。
MongoDB提供以下地理空间查询运算符:
名称 | 描述 |
---|---|
$geoIntersects |
选择与GeoJSON几何形状相交的几何形状。该2dsphere索引支持
$geoIntersects 。 |
$geoWithin |
选择边界GeoJSON几何内的几何。该2dsphere和2D指标支持
$geoWithin 。 |
$near |
返回点附近的地理空间对象。需要地理空间索引。该2dsphere和2D指标支持
$near 。 |
$nearSphere |
返回球体上某个点附近的地理空间对象。需要地理空间索引。该2dsphere和2D指标支持
$nearSphere 。 |
有关更多详细信息(包括示例),请参见各个参考页。
MongoDB地理空间查询可以解释平面或球体上的几何。
2dsphere
索引仅支持球形查询(即解释球形表面几何形状的查询)。
2d
索引支持平面查询(即解释平面上的几何形状的查询)和一些球形查询。虽然2d
索引支持某些球形查询,但2d
对这些球形查询使用索引可能会导致错误。如果可能,将
2dsphere
索引用于球形查询。
下表列出了每个地理空间操作所使用的地理空间查询运算符,受支持的查询:
运作方式 | 球面/平面查询 | 笔记 |
---|---|---|
$near (此行和下一行的GeoJSON重心点为2dsphere索引) |
球形 | 另请参阅$nearSphere 运算符,该运算符与GeoJSON和2dsphere索引一起使用时提供相同的功能。 |
$near (旧版坐标,二维索引) |
平面 | |
$nearSphere (GeoJSON点,2dsphere索引) |
球形 | 提供与 对于球形查询,最好使用
|
$nearSphere (旧版坐标,二维索引) |
球形 | 请改用GeoJSON点。 |
$geoWithin :{ $geometry :…} |
球形 | |
$geoWithin :{ $box :…} |
平面 | |
$geoWithin :{ $polygon :…} |
平面 | |
$geoWithin :{ $center :…} |
平面 | |
$geoWithin :{ $centerSphere :…} |
球形 | |
$geoIntersects |
球形 | |
$geoNear 聚集阶段(2dsphere索引) |
球形 | |
$geoNear 聚集阶段(二维索引) |
平面 |