2dsphere
索引
Overview
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> }
。
sparse
属性
版本 2 和更高版本的2dsphere
索引始终是稀疏索引,并忽略稀疏选项。 如果文档缺少2dsphere
索引字段(或者该字段为null
或空数组),MongoDB 不会将该文档的条目添加到索引中。 对于插入,MongoDB 会插入文档,但不会添加到2dsphere
索引。
对于包含2dsphere
索引键和其他类型键的复合索引,只有2dsphere
索引字段决定索引是否引用文档。
早期版本的 MongoDB 仅支持2dsphere (Version 1)
索引。 默认情况下, 2dsphere (Version 1)
索引并不稀疏,将拒绝带有null
位置字段的文档。
其他 GeoJSON 对象
版本 2 及更高版本的2dsphere
索引支持其他 GeoJSON 对象: MultiPoint
、 MultiLineString
、 MultiPolygon
和GeometryCollection
。 有关所有支持的 GeoJSON 对象的详细信息,请参阅GeoJSON 对象。
Considerations
geoNear
和$geoNear
限制
您可以为$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
索引字段限制
具有2dsphere索引的字段必须以坐标对或GeoJSON数据的形式保存几何数据。 如果您尝试在2dsphere
索引字段中插入包含非几何数据的文档,或者在索引字段包含非几何数据的集合上构建2dsphere
索引,则操作会失败。
有限数量的索引键
为了生成 2dsphere 索引键,mongod
将 GeoJSON 形状映射到内部表示形式。生成的内部表示可能是很大的值数组。
当 mongod
为保存数组的字段生成索引键时,mongod
会为每个数组元素生成一个索引键。对于复合索引,mongod
会计算为每个字段生成的键集的笛卡尔积。如果两个集合都很大,那么计算笛卡尔积可能会导致操作超出内存限制。
indexMaxNumGeneratedKeysPerDocument
限制为单个文档生成的最大键数,防止出现内存不足错误。默认每个文档 100000 个索引键。可以提高限制,但如果某个操作需要的键数超过 indexMaxNumGeneratedKeysPerDocument
参数指定的键数,则操作就会失败。
创建2dsphere
索引
要创建 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" } ] )
创建2dsphere
索引
以下操作在位置字段loc
上创建2dsphere索引:
db.places.createIndex( { loc : "2dsphere" } )
使用2dsphere
索引键创建复合索引
复合索引可以包含2dsphere
索引键与非地理空间索引键的组合。 例如,以下操作创建一个复合索引,其中第一个键loc
是2dsphere
索引键,其余键category
和names
是非地理空间索引键,特别是降序 ( -1
)和升序 ( 1
) 键。
db.places.createIndex( { loc : "2dsphere" , category : -1, name: 1 } )
与2d索引不同,复合2dsphere
索引不要求位置字段是第一个进行索引的字段。 例如:
db.places.createIndex( { category : 1 , loc : "2dsphere" } )