2d インデックスの内部構造
このドキュメントでは、 2 d インデックスの内部について説明します。 この素材は通常の操作やアプリケーション開発には必要ありませんが、トラブルシューティングやさらなる理解に役立つ場合があります。
Geohash Values
legacy coordinate pairs を含むフィールドに地理空間インデックスを作成すると、MongoDB は指定された ロケーション範囲 内の座標ペアの ジオハッシュ 値を計算し、ジオハッシュ値をインデックス化します。
ジオハッシュ値を計算するために、MongoDB は 2 次元マップを四半期ごとに再帰的に分割します。 次に、各四半期に 2 ビットの値を割り当てます。 たとえば、4つの四半期の 2 ビット表現は次のようになります。
01 11 00 10
これらの 2 ビットの値( 00
、 01
、 10
、 11
)は、各四半期と各四半期内のすべてのポイントを表します。 各四半期に対応するジオハッシュ値があります。
四捨五入 | ジオハッシュ |
---|---|
左下 |
|
左上 |
|
右下 |
|
右上 |
|
精度を高めるために、MongoDB は各四半期をサブ四半期に分割できます。 各サブクォーラントには、サブクォーラントの値に連結された、含まれているクォーラントの ジオハッシュ 値があります。 たとえば、右上の四捨五入のジオハッシュは11
で、サブ四捨五入のジオハッシュは (左上からクロック先)になります。
1101
1111
1110
1100
2d インデックスのマルチロケーション ドキュメント
2d インデックスは 1 つのドキュメント内の複数のロケーション フィールドをサポートしていませんが、マルチキー インデックスを使用すると 1 つのドキュメントに複数の座標ペアをインデックスできます。 たとえば、次のドキュメントでは、 locs
フィールドに座標ペアの配列が保持されています。
db.places.insertOne( { locs : [ [ 55.5 , 42.3 ], [ -74 , 44.74 ], { long : 55.5 , lat : 42.3 } ] } )
locs
配列の値は次のいずれかになります。
配列(
[ 55.5, 42.3 ]
と同様)埋め込みドキュメント(
{ long : 55.5 , lat : 42.3 }
など)。
locs
配列内のすべての座標ペアにインデックスを付けるには、 locs
フィールドに 2 d インデックス を作成します。
db.places.createIndex( { "locs": "2d" } )
埋め込みマルチロケーション ドキュメント
位置データは、埋め込みドキュメント内のフィールドとして保存できます。 たとえば、埋め込みドキュメントの配列がある場合、各埋め込みドキュメントには位置データを含む フィールドがあります。
次のドキュメントでは、 addresses
フィールドは埋め込みドキュメントの配列です。 埋め込みドキュメントには、座標ペアであるloc
フィールドが含まれています。
db.records.insertOne( { name : "John Smith", addresses : [ { context : "home" , loc : [ 55.5, 42.3 ] }, { context : "work", loc : [ -74 , 44.74 ] } ] } )
addresses
配列内のすべてのloc
値をインデックス化するには、 addresses.loc
フィールドに 2D インデックス を作成します。
db.records.createIndex( { "addresses.loc": "2d" } )