索引系列:2dsphere索引

2020-05-28 00:00:00 索引 字段 多个 版本 地理



MongoDB Manual (Version 4.2)> Indexes > 2dsphere Indexes



No

1

概述




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


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



No

2

版本变更




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索引始终为sparse且忽略sparse选项。如果文档缺少2dsphere索引所在字段(或者该字段为null或空数组),则MongoDB不会将文档条目添加到索引中。对于插入,MongoDB会插入文档,但不添加到2dsphere索引。


对于包含2dsphere索引键以及其他类型键的复合索引,该索引是否引用文档只取决于2dsphere索引字段。


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



其他GeoJSON对象


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



No

3

思考



geoNear和$geoNear的限制



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


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


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


敲黑板!!!


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



分片键限制


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



2dsphere索引字段限制


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



No

4

创建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索引键和非地理空间索引键。例如,以下操作将创建一个复合索引,其中个键loc是2dsphere索引键,其余键category和names是非地理空间索引键,并分别指定降序(-1)和升序(1)。


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


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


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


原文链接:

https://docs.mongodb.com/manual/core/2dsphere/



译者:周正


MongoDB中文社区翻译小组成员

花名布衣,大龄老码农,喜欢DIY以及编程相关的各种事物;近几年从事车联网相关工作,业余时间热爱足球。



相关文章