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 } 。
稀疏 属性¶
在 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: "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 ] ]
]
}
}
多点¶
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 ] ]
]
}
]
}
}