2dsphere Indexes

在本页面

Overview

2dsphere索引支持查询,该查询可计算类似地球的球体上的几何形状。 2dsphere索引支持所有 MongoDB 地理空间查询:包含,相交和邻近度查询。有关地理空间查询的更多信息,请参见Geospatial Queries

2dsphere索引支持存储为GeoJSON objects 传统坐标对的数据(另请参见2 dsphere 索引字段限制)。对于旧式坐标对,索引会将数据转换为 GeoJSON Point

Versions

2dsphere索引版本 Description
Version 3 MongoDB 3.2 引入了版本 3 的2dsphere索引。版本 3 是在 MongoDB 3.2 及更高版本中创建的2dsphere索引的默认版本。
Version 2 MongoDB 2.6 引入了2dsphere索引的版本 2.版本 2 是在 MongoDB 2.6 和 3.0 系列中创建的2dsphere索引的默认版本。

要覆盖默认版本并指定其他版本,请在创建索引时包括选项{ "2dsphereIndexVersion": <version> }

sparse Property

版本 2 和更高版本的2dsphere索引始终为sparse,而忽略sparse选项。如果文档缺少2dsphere索引字段(或者该字段是null或空数组),则 MongoDB 不会将文档条目添加到索引中。对于插入,MongoDB 插入文档,但不添加到2dsphere索引。

对于包含2dsphere索引键以及其他类型的键的复合索引,只有2dsphere索引字段才能确定索引是否引用文档。

MongoDB 的早期版本仅支持2dsphere (Version 1)索引。 2dsphere (Version 1)索引默认为“不稀疏”,并且将拒绝具有null个位置字段的文档。

其他 GeoJSON 对象

版本 2 和更高版本的2dsphere索引包括对其他 GeoJSON 对象的支持:MultiPointMultiLineStringMultiPolygonGeometryCollection。有关所有受支持的 GeoJSON 对象的详细信息,请参见GeoJSON Objects

Considerations

geoNear 和$ geoNear 限制

geoNear命令和$geoNear流水线阶段要求一个集合最多*仅具有一个2dsphere索引和/或仅一个2d索引,而地理空间查询运算符(例如$near$geoWithin)允许集合具有多个地理空间索引。

由于geoNear命令和$geoNear管线阶段语法都不包含位置字段,因此存在geoNear命令和$geoNear管线阶段的地理空间索引限制。这样,多个2d索引或2dsphere索引之间的索引选择是不明确的。

地理空间查询运算符没有此类限制,因为这些运算符采用了位置字段,从而消除了歧义。

分片键限制

分片集合时,不能将2dsphere索引用作shard key。但是,可以通过使用其他字段作为分片键在分片集合上创建地理空间索引。

2dsphere 索引字段限制

具有2dsphere索引的字段必须以coordinate pairsGeoJSON数据的形式保存几何数据。如果您尝试在2dsphere索引字段中插入具有非几何数据的文档,或者在索引字段具有非几何数据的集合上构建2dsphere索引,则该操作将失败。

创建 2dsphere 索引

要创建2dsphere索引,请使用db.collection.createIndex()方法并指定字符串 Literals"2dsphere"作为索引类型:

db.collection.createIndex( { <location field> : "2dsphere" } )

其中<location field>是值为GeoJSON object传统坐标对的字段。

与可以引用一个位置字段和另一个位置字段的复合2d索引不同,compound 2dsphere索引可以引用多个位置字段和非位置字段。

对于以下示例,请考虑一个集合places,其文档在名为loc的字段中将位置数据存储为GeoJSON Point

db.places.insert(
   {
      loc : { type: "Point", coordinates: [ -73.97, 40.77 ] },
      name: "Central Park",
      category : "Parks"
   }
)

db.places.insert(
   {
      loc : { type: "Point", coordinates: [ -73.88, 40.78 ] },
      name: "La Guardia Airport",
      category : "Airport"
   }
)

创建 2dsphere 索引

以下操作在位置字段loc上创建一个2dsphere索引:

db.places.createIndex( { loc : "2dsphere" } )

使用 2dsphere 索引键创建复合索引

compound index可以包含2dsphere索引键,并结合非地理空间索引键。例如,以下操作将创建一个复合索引,其中第一个键loc2dsphere索引键,其余的键categorynames是非地理空间索引键,分别是降序(-1)和升序(1)。

db.places.createIndex( { loc : "2dsphere" , category : -1, name: 1 } )

2d索引不同,复合2dsphere索引不需要将 location 字段作为第一个索引字段。例如:

db.places.createIndex( { category : 1 , loc : "2dsphere" } )
首页