Docs 菜单
Docs 主页
/
MongoDB Manual
/

2dsphere 索引

在此页面上

  • Overview
  • 版本
  • Considerations
  • 创建2dsphere索引

2dsphere索引支持在类似地球的球体上计算几何图形的查询。 2dsphere索引支持所有MongoDB地理空间查询:包含查询、交集查询和邻近查询。 有关地理空间查询的更多信息,请参阅地理空间查询。

2dsphere索引支持存储为GeoJSON对象legacy coordinate pairs的数据(另请参阅 2dsphere 索引字段限制)。 对于legacy coordinate pairs ,索引会将数据转换为GeoJSON Point

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

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

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

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

早期版本的 MongoDB 仅支持2dsphere (Version 1)索引。 默认情况下, 2dsphere (Version 1)索引并不稀疏,将拒绝带有null位置字段的文档。

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

您可以为$geoNear管道阶段指定key选项,以指示要使用的索引字段路径(Field Path)。 $geoNear这样就允许在具有多个2dsphere 索引和/或多个2 d 索引的集合上使用 阶段:

  • 如果您的collection具有多个2dsphere索引和/或多个2d索引,则必须使用key选项来指定要使用的带索引字段(Field Path)。

  • 如果不指定key ,则不能有多个2dsphere索引和/或多个2d索引,因为没有key ,多个2d索引或2dsphere索引之间的索引选择是不明确的。

注意

如果未指定key ,并且您最多只有一个2dsphere索引和/或只有一个2d索引,MongoDB 首先会查找要使用的2d索引。 如果2d索引不存在,则 MongoDB 会查找要使用的2dsphere索引。

对collection进行分片时,不能使用2dsphere索引作为分片。但是,您可以使用其他field作为分片键,在分片collection上创建地理空间索引。

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

为了生成 2dsphere 索引键,mongodGeoJSON 形状映射到内部表示形式。生成的内部表示可能是很大的值数组。

mongod 为保存数组的字段生成索引键时,mongod 会为每个数组元素生成一个索引键。对于复合索引,mongod 会计算为每个字段生成的键集的笛卡尔积。如果两个集合都很大,那么计算笛卡尔积可能会导致操作超出内存限制。

indexMaxNumGeneratedKeysPerDocument 限制为单个文档生成的最大键数,防止出现内存不足错误。默认每个文档 100000 个索引键。可以提高限制,但如果某个操作需要的键数超过 indexMaxNumGeneratedKeysPerDocument 参数指定的键数,则操作就会失败。

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

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

其中<location field>是一个字段,其值为GeoJSON 对象传统坐标对。

注意

如果尝试在包含 geoJSON 点数组的字段上创建索引,索引构建将失败并返回以下错误:

MongoServerError: Index build failed

复合2d索引可以引用一个位置字段和一个其他字段,而复合2dsphere索引可以引用多个位置和非位置字段。

对于以下示例,请考虑一个collectionplaces ,其中的文档将位置数据作为GeoJSON point存储在名为loc的字段中:

db.places.insertMany( [
{
loc : { type: "Point", coordinates: [ -73.97, 40.77 ] },
name: "Central Park",
category : "Parks"
},
{
loc : { type: "Point", coordinates: [ -73.88, 40.78 ] },
name: "La Guardia Airport",
category : "Airport"
}
] )

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

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

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

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

2d索引不同,复合2dsphere索引不要求位置字段是第一个进行索引的字段。 例如:

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

后退

通配符索引限制