2d对比2dsphere

Mongodb中Index特性

geojson

地理空间索引(Geospatial):为了支持高效的地址位置数据查询,mongodb提供了2种特殊的索引,2d索引(坐标平面)和2sphere索引(经纬球面),存储数据包括经纬度信息(-180 ~ 180)以及数据表示的几何类型;在目前LBS应用中,通过使用Geo索引,可以实现类似于“附近的人、消息”等功能,我们可以利用现有的地图服务获取位置的经纬度信息,同时配合mongodb Geo索引来完成我们的部分业务应用。不过,mongodb并不是专业的LBS数据库。“2d”和2dsphere两种索引要求的document数据结构是不同的,所以开发者需要注意,我们稍后介绍。

2dsphere:经纬球面,如果数据是球面的位置(球面几何),可以使用此索引,2dsphere索引可以与其他多个字段组合。location的数据结构可以为GeoJSON对象或者为传统的坐标对。【参见GeoJSON】mongodb支持如下几种GeoJSON对象:

  1. Point:点
  2. LineString:线段
  3. Polygon:多边形
  4. MultiLineString:多条线段
  5. MultiPoint:多点
  6. MultiPolygon:多个多变形
  7. GeometryCollection

2d:平面坐标,在平面几何(欧几里得几何)中计算距离,我们可以存储一些传统的坐标对,这时就可以使用2d索引,2d索引最多只能与一个其他的字段组合,且2d字段必须做前缀,这与2dsphere是有区别的。不过2d索引是mongodb的旧版特性,在2.6之后,我们可以统一使用2dsphere即可,2d索引可以通过转换成GeoJSON中Point类型。

我们使用Geo索引对坐标数据进行如下类型的查询:

  1. 包含:可以查询包含(inclusion)在指定的多边形区域内的locations(所对应的documents,或者indexes),使用$geoWithin操作符。2d和2dsphere都支持包含查询。
  2. 相交(intersection):可以查询与指定的几何体相交的locations,仅支持球面数据,即2dsphere索引,使用$geoIntersects操作。
  3. 临近(proximity):可以查询与指定的point最近的其他points,使用$near操作,2d和2dsphere都支持。

Geo两种索引都不能作为shard key(sharding cluster模式中),当然可以存储在sharded collection中,只是不能作为shard key。不过在shared collection中,$near和$nearSphere将不支持,而是使用$geoNear替代。(稍后专门介绍这些指令)

results matching ""

    No results matching ""