2d
索引内部结构
本文档更深入地解释了 MongoDB 的2d
地理空间索引的内部结构。 本材料不是正常操作或应用程序开发所必需的,但可能有助于故障排除和进一步了解。
计算 索引的 Geohash 值2d
当您在 上创建地理空间索引时,legacy coordinate pairs MongoDB会计算指定 位置范围 内坐标对的 地理哈希(Geohash) 值,然后对地理哈希(Geohash)值进行索引。
要计算 geohash 值,请以递归方式将二维地图划分为多个象限。 然后为每个象限分配一个两位值。 例如,四个象限的两位表示为:
01 11 00 10
这些两位值( 00
、 01
、 10
和11
)代表每个象限以及每个象限内的所有点。 对于具有两位分辨率的 geohash,左下象限中的所有点的 geohash 均为00
。 左上象限的 geohash 为01
。 右下角和右上角的 geohash 分别为10
和11
。
为了提供更高的精度,请继续将每个象限划分为子象限。 每个子象限都将包含象限的 geohash 值与子象限的值连接起来。 右上象限的 geohash 为11
,子象限的 geohash 为(从左上角开始顺时针):分别为1101
、 1111
、 1110
和1100
。
索引的多位置文档2d
注意
虽然2d
地理空间索引不支持一个文档中存在多个地理空间字段,但您可以使用多键索引来为单个文档中的多个坐标对建立索引。 在最简单的示例中,您可能有一个字段(例如 locs
),它保存一个坐标数组,如以下示例所示:
db.places.save( { locs : [ [ 55.5 , 42.3 ] , [ -74 , 44.74 ] , { lng : 55.5 , lat : 42.3 } ] } )
数组的值可以是数组(如[ 55.5, 42.3 ]
所示),也可以是嵌入式文档(如{ lng : 55.5 , lat : 42.3 }
。
然后,您可以在locs
字段上创建地理空间索引,如下所示:
db.places.createIndex( { "locs": "2d" } )
您还可以将位置数据建模为嵌入式文档内的字段。 在这种情况下,文档将包含一个字段(例如 addresses
),它包含一个文档数组,其中每个文档都有一个字段(例如 loc:
),用于保存位置坐标。 例如:
db.records.save( { name : "John Smith", addresses : [ { context : "home" , loc : [ 55.5, 42.3 ] } , { context : "work", loc : [ -74 , 44.74 ] } ] } )
然后,您可以在addresses.loc
字段上创建地理空间索引,如以下示例所示:
db.records.createIndex( { "addresses.loc": "2d" } )