OPTIONS
翻译或纠错本页面

2dsphere 索引

2.4 新版功能.

一个 2dsphere 索引支持在类地球的球面上计算地理信息的查询。索引支持存储为 GeoJSON 对象和普通坐标的数据。索引支持普通坐标的方式是,将坐标转换为GeoJSON 单点 类型。在MongoDB2.4中,类地球球面的参考系默认使用的数据是 WGS84 。坐标顺序是 经度,纬度

对于所有的MongoDB地理查询, 2dsphere 索引都是支持的,包括:包含,交叉,邻近。参见 Geospatial Query Operators 了解可以支持地理空间查询的查询操作符。

如果想创建 2dsphere 索引,请使用 db.collection.ensureIndex 命令。另外, 复合 2dsphere 索引可以索引一篇文档中多个地址和其他非位置型数据。参见 创建 2dsphere 索引 了解更多细节。

2dsphere 索引版本2

在 2.6 版更改.

从MongoDB第2.6版本开始启用了第2版的 2dsphere 索引。在MongoDB2.6版本中创建的 2dsphere 索引默认都是第2版的。 如果您想要创建一个版本1的 2dsphere 索引,请在创建索引时包含选项 { "2dsphereIndexVersion": 1 }

其他GeoJSON对象

在 2.6 版更改.

索引版本2添加了对其他GeoJSON对象的支持: 多点, 多线段, MultiPolygon, and 几何体集合.

稀疏 属性

在 2.6 版更改.

默认情况下, 2dsphere 索引是 稀疏 的,并且忽略 sparse: true 选项。如果一篇文档中不包含 2dsphere 索引键(或者这个键存储的是 null 或者空数组),那么MongoDB将不会为这篇文档建立 2dsphere 索引项。如果是一个插入操作,MongoDB会插入这篇文档,但不把它加到 2dsphere 索引中。

在一个复合索引中,如果同时包含了 2dsphere 索引键和其他类型的键, 那么只有 2dsphere 键可以决定索引是否要引用一篇文档。

在更早版本的MongoDB中,只支持 2dsphere 的版本1. 版本1 2dsphere 索引默认 不是 稀疏的并且会拒绝保存那些在位置键上值为 null 的文档。

注意事项

geoNear$geoNear 的限制

注意, geoNear 命令和 $geoNear 管道阶段要求一个集合中 最多 只能有一个 2dsphere index 或者 2d index ,但是 地理查询操作符 (例如 $near$geoWithin) 允许几何拥有多个地理索引。

对地理索引的之所以有这样的限制, 是因为 geoNear 命令和 $geoNear 管道 的格式里没有包含位置索引键。因此,如何在多个 2d 或者 2dsphere 索引中做选择这将造成歧义。

而对于 地理查询操作符 没有这样的限制是因为,这些操作符都要求指定一个位置键,消除了歧义。

分片键限制

当把一个集合分片时, 您不应该使用 2dsphere 索引键作为分片键。 但是,在使用其他键作为分片键的前提下, 您可以在被分片的集合上创建并维护一个地理索引。

GeoJSON对象

MongoDB支持如下GeoJSON对象:

注意, 多点, 多线段, MultiPolygon, 和 几何体集合 都需要 2dsphere 索引版本2.

为了能对GeoJSON数据进行索引,您必须把GeoJSON数据存储在您指定的位置键。方法是, 在这个键中存储一个子文档,其中 type 键指定了GeoJSON对象类型, coordinates 指定了这个GeoJSON对象的坐标(们)。请将坐标按照 经度,纬度 的顺序存储。

就像如下格式:

{ <location field>: { type: "<GeoJSON type>" , coordinates: <coordinates> } }

单点

2.4 新版功能.

以下的例子存储了一个GeoJSON 单点 :

{ loc: { type: "Point", coordinates: [ 40, 5 ] } }

线段

2.4 新版功能.

以下的例子存储了一个GeoJSON 线段 :

{ loc: { type: "LineString", coordinates: [ [ 40, 5 ], [ 41, 6 ] ] } }

多边形

2.4 新版功能.

多边形 由GeoJSON 线环 数组组成。而一个 线环 就是闭合的 线段 。闭合 线段 至少要有4对坐标,并且第一个和最后一个坐标必须是相同的。

在曲面上两点间线段和在平面上的两点间线段,可能包含的是不同的点集。在曲面上的线段是一条大地线(geodesic, 数学用语,曲面上两点间距离最短的线)。注意仔细检查点坐标,以避免共用边,或者重叠,或者其他交叉类型的错误。

单一线环的多边形

以下的示例展示了存储一个只有外部线环且没有内部线环(或者称之为洞)的GeoJSON 多边形 。注意,这里第一个和最后一个的坐标都是 [ 0 , 0 ]

{
  loc :
    {
      type: "Polygon",
      coordinates: [ [ [ 0 , 0 ] , [ 3 , 6 ] , [ 6 , 1 ] , [ 0 , 0  ] ] ]
    }
}

如果多边形只有一个线环, 这个环不能和自身相交。

多个环的多边形

多个线环的多边形

  • 第一个线环必须是外部线环(即, 它是外部边界)。

  • 这个外部线环不能和自身相交。

  • 任何内部环必须完全地被包容在外部环的范围内。

  • 内部环之间不能相交或者重叠。内部环不能共用一条边。

如下文档代表了一个带有一个内部环的GeoJSON多边形:

{ loc : {
     type : "Polygon",
     coordinates : [
         [ [ 0 , 0 ] , [ 3 , 6 ] , [ 6 , 1 ] , [ 0 , 0 ] ],
         [ [ 2 , 2 ] , [ 3 , 3 ] , [ 4 , 2 ] , [ 2 , 2 ] ]
     ]
  }
}
Diagram of a Polygon with internal ring.

Diagram of a Polygon with internal ring.

多点

2.6 新版功能: 要求 2dsphere 索引版本2.

如下示例存储了GeoJSON 多点 类型的坐标数据:

{ loc: {
    type: "MultiPoint",
    coordinates: [
       [ -73.9580, 40.8003 ],
       [ -73.9498, 40.7968 ],
       [ -73.9737, 40.7648 ],
       [ -73.9814, 40.7681 ]
    ]
  }
}

多线段

2.6 新版功能: 要求 2dsphere 索引版本2.

如下示例存储了GeoJSON 多线段 类型的坐标数据:

{ loc:
    {
      type: "MultiLineString",
      coordinates: [
         [ [ -73.96943, 40.78519 ], [ -73.96082, 40.78095 ] ],
         [ [ -73.96415, 40.79229 ], [ -73.95544, 40.78854 ] ],
         [ [ -73.97162, 40.78205 ], [ -73.96374, 40.77715 ] ],
         [ [ -73.97880, 40.77247 ], [ -73.97036, 40.76811 ] ]
      ]
    }
}

MultiPolygon

2.6 新版功能: 要求 2dsphere 索引版本2.

如下示例存储了GeoJSON MultiPolygon 类型的坐标数据:

{ loc:
    {
      type: "MultiPolygon",
      coordinates: [
         [ [ [ -73.958, 40.8003 ], [ -73.9498, 40.7968 ], [ -73.9737, 40.7648 ], [ -73.9814, 40.7681 ], [ -73.958, 40.8003 ] ] ],
         [ [ [ -73.958, 40.8003 ], [ -73.9498, 40.7968 ], [ -73.9737, 40.7648 ], [ -73.958, 40.8003 ] ] ]
      ]
    }
}

几何体集合

2.6 新版功能: 要求 2dsphere 索引版本2.

如下示例存储了GeoJSON 几何体集合 类型的坐标数据:

{ loc:
    {
      type: "GeometryCollection",
      geometries: [
         {
            type: "MultiPoint",
            coordinates: [
               [ -73.9580, 40.8003 ],
               [ -73.9498, 40.7968 ],
               [ -73.9737, 40.7648 ],
               [ -73.9814, 40.7681 ]
            ]
         },
         {
            type: "MultiLineString",
            coordinates: [
               [ [ -73.96943, 40.78519 ], [ -73.96082, 40.78095 ] ],
               [ [ -73.96415, 40.79229 ], [ -73.95544, 40.78854 ] ],
               [ [ -73.97162, 40.78205 ], [ -73.96374, 40.77715 ] ],
               [ [ -73.97880, 40.77247 ], [ -73.97036, 40.76811 ] ]
            ]
         }
      ]
    }
}