2dsphere 索引
在本页面
概述
2dsphere
索引支持计算类似地球的球体上的几何形状的查询。2dsphere
索引支持所有MongoDB地理空间查询:包含、相交和邻近度查询。 有关地理空间查询的更多信息,请参见地理空间查询。
2dsphere
索引支持存储为GeoJSON对象和旧版坐标对的数据(另请参阅2dsphere索引字段限制)。对于遗留坐标对,索引将数据转换为GeoJSONPoint。
版本号
版本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
属性
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对象的支持:MultiPoint,MultiLineString,MultiPolygon和GeometryCollection。有关所有受支持的GeoJSON对象的详细信息,请参见GeoJSON对象。
注意事项
geoNear
和$geoNear
的限制
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
索引字段限制具有2dsphere索引的字段必须包含坐标对或GeoJSON形式的数据。如果您尝试插入一个在2dsphere
索引字段中包含非几何数据的文档,或者在一个索引字段中包含非几何数据的集合上构建2dsphere
索引,该操作将失败。
创建2dsphere
索引
2dsphere
索引要创建2dsphere
索引,请使用db.collection.createIndex()
方法并指定字符串"2dsphere"
作为索引类型:
其中的<location field>
是其值为GeoJSON对象或旧式坐标对的字段。
与只能引用一个位置字段和另一个字段的复合2d索引不同的是,复合2dsphere
索引可以引用多个位置字段及非位置字段。
以下示例,基于一个places
集合,该集合的文档将位置数据以GeoJSON Point形式存储在loc
字段中:
创建2dsphere
索引
2dsphere
索引以下操作在位置字段loc
上创建一个2dsphere索引:
使用2dsphere
索引键创建复合索引
2dsphere
索引键创建复合索引复合索引可以包含2dsphere
索引键和非地理空间索引键。例如,以下操作将创建一个复合索引,其中第一个键loc
是2dsphere
索引键,其余键category
和names
是非地理空间索引键,并分别指定降序(-1
)和升序(1
)。
与2d索引不同,复合2dsphere
索引不需要将位置字段作为第一个索引字段。 例如:
译者:杨帅 周正
最后更新于