Docs 菜单
Docs 主页
/
MongoDB Manual
/ /

2d 索引内部结构

在此页面上

  • 计算2d索引的 Geohash 值
  • 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" } )

后退

查询 2d 索引