OPTIONS
翻译或纠错本页面

创建 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 索引

例如,如下命令会在键 loc 上创建 2dsphere 索引:

db.places.ensureIndex( { loc : "2dsphere" } )

创建带有 2dsphere 索引键的复合索引

MongoDB中 复合索引 可以包括一个 2dsphere 索引键和其他非地理索引键。例如如下操作会创建一个复合索引,其中第一个键 loc 是一个 2dsphere 索引,而剩下的键 categorynames 都是非地理索引键,分别是递减( -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 索引。