On this page
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 对象的支持:MultiPoint,MultiLineString,MultiPolygon和GeometryCollection。有关所有受支持的 GeoJSON 对象的详细信息,请参见GeoJSON Objects。
Considerations
geoNear 和$ geoNear 限制
geoNear命令和$geoNear流水线阶段要求一个集合最多*仅具有一个2dsphere
索引和/或仅一个2d索引,而地理空间查询运算符(例如$near和$geoWithin)允许集合具有多个地理空间索引。
由于geoNear命令和$geoNear管线阶段语法都不包含位置字段,因此存在geoNear命令和$geoNear管线阶段的地理空间索引限制。这样,多个2d
索引或2dsphere
索引之间的索引选择是不明确的。
地理空间查询运算符没有此类限制,因为这些运算符采用了位置字段,从而消除了歧义。
分片键限制
2dsphere 索引字段限制
具有2dsphere索引的字段必须以coordinate pairs或GeoJSON数据的形式保存几何数据。如果您尝试在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
索引键,并结合非地理空间索引键。例如,以下操作将创建一个复合索引,其中第一个键loc
是2dsphere
索引键,其余的键category
和names
是非地理空间索引键,分别是降序(-1
)和升序(1
)。
db.places.createIndex( { loc : "2dsphere" , category : -1, name: 1 } )
与2d索引不同,复合2dsphere
索引不需要将 location 字段作为第一个索引字段。例如:
db.places.createIndex( { category : 1 , loc : "2dsphere" } )