本文档对MongoDB 2d
地理空间索引的内部结构提供了更深入的说明
。该材料对于正常操作或应用程序开发不是必需的,但对于故障排除和进一步的了解可能很有用。
2d
索引的Geohash值的计算¶当您创建一个地理空间索引遗留坐标对,MongoDB的计算地理散列的坐标指定的范围内对值位置范围,然后索引地理散列值。
要计算geohash值,请将二维地图递归地划分为多个象限。然后为每个象限分配一个两位值。例如,四个象限的两位表示为:
这两个位值(00
,01
,10
,和11
)表示每个各象限内的象限和所有点的。对于具有两位分辨率的geohash,左下象限中的所有点的geohash将为00
。左上象限的地理哈希为01
。右下角和右上角会有一个地理散列10
和11
分别。
为了提供更高的精度,请继续将每个象限划分为子象限。每个子象限的包含象限的geohash值将与子象限的值连接在一起。为右上象限中的地理散列是11
,和用于子象限的地理散列将是(从左上角的顺时针方向): ,1101
,
1111
,1110
和1100
,分别。
2d
索引的多位置文档¶注意
2dsphere索引可以覆盖文档中的多个地理空间字段,并且可以使用 MultiPoint嵌入式文档来表示点列表 。
虽然2d
地理空间索引不支持一个文档中的多个地理空间字段,但是您可以使用多键索引为单个文档中的多个坐标对建立索引。在最简单的示例中,您可能具有一个locs
包含坐标数组的字段(例如
),如以下示例所示:
数组的值可以是中的数组,也可以是中的嵌入式文档。[ 55.5, 42.3 ]
{ lng : 55.5 , lat : 42.3 }
然后,您可以在locs
字段上创建地理空间索引,如下所示:
您也可以将位置数据建模为嵌入式文档内部的字段。在这种情况下,文档将包含一个包含文档addresses
数组的字段(例如),其中每个文档都有一个loc:
保存位置坐标的字段(例如)。例如:
然后,可以addresses.loc
像下面的示例一样在字段上创建地理空间索引: