ANNOUNCEMENT: Voyage AI joins MongoDB to power more accurate and trustworthy AI applications on Atlas.
Learn more
Docs 菜单

2d 索引内部结构

本文档更深入地解释了 MongoDB 的2d地理空间索引的内部结构。 本材料不是正常操作或应用程序开发所必需的,但可能有助于故障排除和进一步了解。

legacy coordinate pairs 上创建地理空间索引时,MongoDB 会计算指定 位置范围 内坐标对的 geohash 值,然后对 geohash 值进行索引。

要计算 geohash 值,请以递归方式将二维地图划分为多个象限。 然后为每个象限分配一个两位值。 例如,四个象限的两位表示为:

01 11
00 10

这些两位值( 00011011 )代表每个象限以及每个象限内的所有点。 对于具有两位分辨率的 geohash,左下象限中的所有点的 geohash 均为00 。 左上象限的 geohash 为01 。 右下角和右上角的 geohash 分别为1011

为了提供更高的精度,请继续将每个象限划分为子象限。 每个子象限都将包含象限的 geohash 值与子象限的值连接起来。 右上象限的 geohash 为11 ,子象限的 geohash 为(从左上角开始顺时针):分别为1101111111101100

注意

虽然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" } )