2d
インデックスの内部構造
このドキュメントでは、MongoDB の2d
地理空間インデックスの内部構造についてより詳しく説明します。 この素材は通常の操作やアプリケーション開発には必要ありませんが、トラブルシューティングやさらなる理解に役立つ場合があります。
インデックスのジオハッシュ値の計算2d
legacy coordinate pairs に地理空間インデックスを作成すると、MongoDB は指定された ロケーション範囲 内の座標ペアの ジオハッシュ 値を計算し、ジオハッシュ値をインデックス化します。
ジオハッシュ値を計算するには、2 次元マップを四半期ごとに再帰的に分割します。 次に、各四半期に 2 ビットの値を割り当てます。 たとえば、4つの四半期の 2 ビット表現は次のようになります。
01 11 00 10
これらの 2 ビットの値( 00
、 01
、 10
、 11
)は、各四捨五入と各構成要素内のすべてのポイントを表します。 2 ビットの解像度のジオハッシュの場合、左下の四捨五入のすべてのポイントのジオハッシュは00
になります。 左上の四捨五入のジオハッシュは01
になります。 右下と右上では、それぞれ10
と11
のジオハッシュが含まれます。
精度を高めるには、各四半期をサブクエリーに分割し続けます。 各サブクォーラントには、含まれているクォーラントの ジオハッシュ 値がサブクォーラントの値と連結されています。 右上四捨五入のジオハッシュは11
で、サブ四捨五入のジオハッシュは(左上から順に)それぞれ1101
、 1111
、 1110
、 1100
になります。
2d
インデックスのマルチロケーション ドキュメント
注意
2d
地理空間インデックスは 1 つのドキュメント内の複数の地理空間フィールドをサポートしていませんが、マルチキー インデックスを使用して 1 つのドキュメントに複数の座標ペアをインデックスできます。 最も単純な例では、 フィールド(例: 次の例のように、座標の配列を保持する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" } )