2 d 索引内部

在本页面

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

计算 2d 索引的 Geohash 值

传统坐标对上创建地理空间索引时,MongoDB 将为指定location range内的坐标对计算geohash值,然后为 geohash 值构建索引。

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

01  11

00  10

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

为了提供更高的精度,请 continue 将每个象限划分为子象限。每个子象限的包含象限的 geohash 值将与子象限的值连接在一起。右上象限的 geohash 为11,次象限的 geohash 分别为(从左上角顺时针方向):1101111111101100

二维索引的多位置文档

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