2d
索引内部
在本页面
本文对MongoDB的 2d 地理空间索引的内部原理进行了更深入的解释。本材料不是正常操作或应用程序开发所必需的,但对于故障排除和进一步理解可能很有用。
2d
索引的Geohash值的计算
当你创建一个地理空间索引遗留坐标对,MongoDB计算地理散列的坐标对在指定位置范围和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”索引的多位置文档
注意
索引可以覆盖文档中的多个地理空间字段,并且可以使用MultiPoint嵌入式文档表示点列表。
虽然 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" } )
您还可以将位置数据建模为嵌入文档中的一个字段。在这种情况下,文档将包含一个字段(例如。’ address ‘),它包含一个文档数组,其中每个文档都有一个字段(例如。’ loc: ‘)保存位置坐标。例如:
db.records.save( {
name : "John Smith",
addresses : [ {
context : "home" ,
loc : [ 55.5, 42.3 ]
} ,
{
context : "work",
loc : [ -74 , 44.74 ]
}
]
} )
然后可以在 addresses 上创建地理空间索引。字段如下例所示:
db.records.createIndex( { "addresses.loc": "2d" } )