2 d 索引内部
在本页面
本文档对 MongoDB 2d
地理空间索引的内部结构提供了更深入的说明。该材料对于正常操作或应用程序开发不是必需的,但对于故障排除和进一步的了解可能很有用。
计算 2d 索引的 Geohash 值
在传统坐标对上创建地理空间索引时,MongoDB 将为指定location range内的坐标对计算geohash值,然后为 geohash 值构建索引。
要计算 geohash 值,请将二维 Map 递归地划分为多个象限。然后为每个象限分配一个两位值。例如,四个象限的两位表示为:
01 11
00 10
这些两位值(00
,01
,10
和11
)表示每个象限以及每个象限内的所有点。对于具有两位分辨率的 geohash,左下象限中的所有点的 gehash 为00
。左上象限的地理哈希为01
。右下和右上的 geohash 分别为10
和11
。
为了提供更高的精度,请 continue 将每个象限划分为子象限。每个子象限的包含象限的 geohash 值将与子象限的值连接在一起。右上象限的 geohash 为11
,次象限的 geohash 分别为(从左上角顺时针方向):1101
,1111
,1110
和1100
。
二维索引的多位置文档
Note
2dsphere索引可以覆盖文档中的多个地理空间字段,并且可以使用MultiPoint嵌入式文档来表示点列表。
虽然2d
个地理空间索引不支持一个文档中的多个地理空间字段,但是您可以使用multi-key index为单个文档中的多个坐标对构建索引。在最简单的示例中,您可能具有一个保存坐标数组的字段(例如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" } )
要将位置字段与距离字段包括在多位置文档查询中,请在geoNear命令中指定includeLocs: true
。