2dsphere 索引

在本页面

2dsphere索引支持存储为GeoJSON对象旧版坐标对的数据(另请参阅2dsphere索引字段限制)。对于遗留坐标对,索引将数据转换为GeoJSONPoint

版本号

2dsphere索引版本

描述

版本3

MongoDB 3.2引入了一个版本3的2dsphere索引。版本3是在MongoDB 3.2和更高版本中创建的2dsphere索引的默认版本。

版本2

MongoDB 2.6引入了2dsphere索引的版本2。版本2是在MongoDB 2.6和3.0系列中创建的2dsphere索引的默认版本。

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

sparse属性

版本2和更高版本的2dsphere索引始终为sparse且忽略sparse选项。如果文档缺少2dsphere索引所在字段(或者该字段为null或空数组),则MongoDB不会将文档条目添加到索引中。对于插入,MongoDB会插入文档,但不添加到2dsphere索引。对于包含2dsphere索引键以及其他类型键的复合索引,该索引是否引用文档只取决于2dsphere索引字段。

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

MongoDB的早期版本仅支持2dsphere (Version 1)索引。 默认情况下,2dsphere (Version 1)索引不是sparse索引,并且拒绝该字段为空的文档。

其他GeoJSON对象

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

注意事项

geoNear$geoNear的限制

从MongoDB 4.0开始,您可以为$geoNear管道指定一个key选项以明确指示要使用的索引字段路径。这使得$geoNear在具有多个2dsphere索引或多个2d索引的文档中也能被使用:

  • 如果您的集合具有多个2dsphere索引或多个2d索引,则必须使用key选项来指定使用哪个索引字段路径。

  • 如果未指定key,您将无法使用多个2dsphere索引或多个2d索引。 因为没有指定key时,在多个2d索引或2dsphere索引中选择索引将变得无法明确。

[success] 注意

如果您不指定key,您将最多只能拥有一个2dsphere索引或一个2dsphere索引,MongoDB首先寻找2d索引。 如果不存在2d索引,则MongoDB会寻找2dsphere索引。

分片键限制

对集合做分片时,不能将2dsphere索引用作分片键。 但是,您可以通过使用一个不同的字段作为分片键来在分片集合上创建地理空间索引。

2dsphere索引字段限制

具有2dsphere索引的字段必须包含坐标对GeoJSON形式的数据。如果您尝试插入一个在2dsphere索引字段中包含非几何数据的文档,或者在一个索引字段中包含非几何数据的集合上构建2dsphere索引,该操作将失败。

创建2dsphere索引

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

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

其中的<location field>是其值为GeoJSON对象旧式坐标对的字段。

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

以下示例,基于一个places集合,该集合的文档将位置数据以GeoJSON Point形式存储在loc字段中:

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索引键创建复合索引

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

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

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

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

译者:杨帅 周正