Docs Menu
Docs Home
/
MongoDBマニュアル
/ / / /

2d インデックスの内部構造

項目一覧

  • Geohash Values
  • 2d インデックスのマルチロケーション ドキュメント
  • 埋め込みマルチロケーション ドキュメント
  • 詳細

このドキュメントでは、 2 d インデックスの内部について説明します。 この素材は通常の操作やアプリケーション開発には必要ありませんが、トラブルシューティングやさらなる理解に役立つ場合があります。

legacy coordinate pairs を含むフィールドに地理空間インデックスを作成すると、MongoDB は指定された ロケーション範囲 内の座標ペアの ジオハッシュ 値を計算し、ジオハッシュ値をインデックス化します。

ジオハッシュ値を計算するために、MongoDB は 2 次元マップを四半期ごとに再帰的に分割します。 次に、各四半期に 2 ビットの値を割り当てます。 たとえば、4つの四半期の 2 ビット表現は次のようになります。

01 11
00 10

これらの 2 ビットの値( 00011011 )は、各四半期と各四半期内のすべてのポイントを表します。 各四半期に対応するジオハッシュ値があります。

四捨五入
ジオハッシュ

左下

00

左上

01

右下

10

右上

11

精度を高めるために、MongoDB は各四半期をサブ四半期に分割できます。 各サブクォーラントには、サブクォーラントの値に連結された、含まれているクォーラントの ジオハッシュ 値があります。 たとえば、右上の四捨五入のジオハッシュは11で、サブ四捨五入のジオハッシュは (左上からクロック先)になります。

  • 1101

  • 1111

  • 1110

  • 1100

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

戻る

平面上の形状