创建 2dsphere 索引¶
如果需要对GeoJSON格式的数据建立地理索引,可以使用 db.collection.ensureIndex() 方法来创建 2dsphere索引 。在传递给 db.collection.ensureIndex() 方法作参数的索引明细里,将位置数据的键指定为被索引键并将字符串 "2dsphere" 指定为它的值:
db.collection.ensureIndex( { <location field> : "2dsphere" } )
如下示例展示了用带有GeoJSON数据的文档来填充集合并创建 2dsphere索引 的步骤。虽然,例子中是先填充集合,您也可以先创建索引。
步骤¶
首先,用文档填充集合,文档的 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 索引。
创建带有 2dsphere 索引键的复合索引¶
MongoDB中 复合索引 可以包括一个 2dsphere 索引键和其他非地理索引键。例如如下操作会创建一个复合索引,其中第一个键 loc 是一个 2dsphere 索引,而剩下的键 category 和 names 都是非地理索引键,分别是递减( -1 ) 和 递增( 1 ) 的。
db.places.ensureIndex( { loc : "2dsphere" , category : -1, name: 1 } )
和 2d 索引不同的是,带有 2dsphere 索引的复合索引中, 2dsphere 的键可以不是第一个键。例如:
db.places.ensureIndex( { category : 1 , loc : "2dsphere" } )
注意事项¶
命令 geoNear 和 $geoNear 管道要求集合中最多只能有一个 2dsphere index 或者 只能一个 2d index ,但是 地理查询操作符 (例如 $near 和 $geoWithin) 就允许集合拥有多个地理索引。
对地理索引的之所以有这样的限制, 是因为 geoNear 命令和 $geoNear 管道 的格式里没有包含位置索引键。因此,如何在多个 2d 或者 2dsphere 索引中做选择这将造成歧义。
而对于 地理查询操作符 没有这样的限制是因为,这些操作符都要求指定一个位置键,消除了歧义。
因此,虽然在本教程中创建了多个 2dsphere 索引,当在示例中的集合上使用 geoNear 命令或者 $geoNear 管道时,您需要保留一个 2dsphere 索引删除剩余所有。
参见 查询 2dsphere 索引 查看如何在查询中使用 2dsphere 索引。