2dsphere
Indexes
Overview
2dsphere
インデックスは、地球のような球体上のジオメトリを計算するクエリをサポートします。 2dsphere
インデックスは、すべての MongoDB 地理空間クエリ(包含、交差、近接性のクエリ)をサポートしています。 地理空間クエリの詳細については、「 地理空間クエリ 」を参照してください。
2dsphere
インデックスは、 GeoJSON オブジェクトとlegacy coordinate pairsとして保存されたデータをサポートしています( 2dsphere
インデックス付きフィールド制限も参照してください)。 legacy coordinate pairsの場合、インデックスはデータを GeoJSON Point
に変換します。
バージョン
2dsphere インデックス バージョン | 説明 |
---|---|
バージョン 3 | MongoDB 3.2 では、 |
バージョン 2 | MongoDB 2.6 では、 |
デフォルト バージョンを上書きして別のバージョンを指定するには、インデックスの作成時にオプション{ "2dsphereIndexVersion": <version> }
を含めます。
sparse
プロパティ
バージョン 2 以降の2dsphere
インデックスは常にスパースで、スパースオプションを無視します。 ドキュメントに2dsphere
インデックス フィールドがない場合(またはフィールドがnull
または空の配列である場合)、MongoDB はドキュメントのエントリーをインデックスに追加しません。 挿入の場合、MongoDB はドキュメントを挿入しますが、 2dsphere
インデックスには追加しません。
2dsphere
インデックス キーと他のタイプのキーを含む複合インデックスの場合、インデックスがドキュメントを参照するかどうかは、 2dsphere
インデックス フィールドのみによって決定します。
MongoDB の以前のバージョンは2dsphere (Version 1)
インデックスのみをサポートしていました。 2dsphere (Version 1)
インデックスはデフォルトではスパースではなく、 null
のロケーション フィールドを持つドキュメントを拒否します。
追加の GeoJSON オブジェクト
バージョン 2 以降の2dsphere
インデックスには、追加の GeoJSON オブジェクト( MultiPoint
、 MultiLineString
、 MultiPolygon
、 GeometryCollection
)のサポートが含まれています。 サポートされているすべての GeoJSON オブジェクトの詳細については、 「 GeoJSON オブジェクト」 を参照してください。
Considerations
geoNear
および$geoNear
の制限
使用するインデックス付きフィールドパスを示すには、 $geoNear
パイプライン ステージにkey
オプションを指定します。 これにより、複数の インデックスや複数の2 d $geoNear
インデックスを持つコレクションで2dsphere
ステージを使用できます。
コレクションに複数の
2dsphere
インデックスや複数の2dインデックスがある場合は、使用するインデックス付きフィールドパスを指定するためにkey
オプションを使用する必要があります。key
を指定しない場合、複数の2dsphere
インデックスや複数の2dインデックスを使用できません。key
が ない と、複数の2d
インデックスまたは2dsphere
インデックス間のインデックス選択があいまいなためです。
注意
key
を指定せず、 2dsphere
インデックスが最大で 1 つしかない、もしくは2dインデックスが 1 つしかない場合、または両方ある場合、MongoDB は使用する2d
インデックスを最初に探します。 2d
インデックスが存在しない場合、MongoDB は使用する2dsphere
インデックスを探します。
シャードキーの制限
コレクションをシャーディングする場合、 2dsphere
インデックスをシャードキーとして使用することはできません。 ただし、別のフィールドをシャードキーとして使用して、シャーディングされたコレクションに地理空間インデックスを作成することはできます。
2dsphere
インデックス付きフィールドの制限
2dsphereインデックスを持つフィールドには、座標ペアまたはGeoJSONデータの形式でジオメトリ データを格納する必要があります。 2dsphere
インデックス付きフィールドにジオメトリデータ以外のデータを含むドキュメントを挿入しようとしたり、インデックス付きフィールドにジオメトリ以外のデータが含まれているコレクションに2dsphere
インデックスを構築しようとしたりすると、操作は失敗します。
インデックス キーの個数制限
2dsphere インデックスのキーを生成するために、mongod
は GeoJSON シェイプを内部表現にマッピングします。結果として得られる内部表現は、値の大きな配列になる可能性があります。
mongod
が配列を保持するフィールドにインデックス キーを生成する場合、mongod
は配列要素ごとにインデックス キーを生成します。複合インデックスの場合、mongod
は各フィールドに対して生成されたキーセットの直積集合を計算します。両方のセットが大きい場合、直積集合の計算によって操作がメモリ制限を超える可能性があります。
indexMaxNumGeneratedKeysPerDocument
は、メモリ不足エラーを防ぐために、単一のドキュメントに対して生成されるキーの最大数を制限します。デフォルトは 1 ドキュメントあたり 100000 インデックス キーです。制限を引き上げることは可能ですが、indexMaxNumGeneratedKeysPerDocument
パラメーターで指定された数より多くのキーが操作に必要な場合、操作は失敗します。
2dsphere
インデックスの作成
2dsphere
インデックスを作成するには、db.collection.createIndex()
メソッドを使用し、インデックス タイプとして文字列リテラル "2dsphere"
を指定します。
db.collection.createIndex( { <location field> : "2dsphere" } )
<location field>
は、値がGeoJSON オブジェクトまたはlegacy coordinates pair のいずれかであるフィールドです。
注意
geoJSON ポイントの配列を含むフィールドにインデックスを作成しようとすると、インデックス構築に失敗し、以下のエラーが返されます。
MongoServerError: Index build failed
1 つのロケーション フィールドと 1 つの他のフィールドを参照できる複合2dインデックスとは異なり、複合2dsphere
インデックスは複数のロケーション フィールドと非ロケーション フィールドを参照できます。
次の例では、 loc
という名前のフィールドに位置データをGeoJSON ポイントとして保存するドキュメントを含むコレクションplaces
を考えてみましょう。
db.places.insertMany( [ { loc : { type: "Point", coordinates: [ -73.97, 40.77 ] }, name: "Central Park", category : "Parks" }, { loc : { type: "Point", coordinates: [ -73.88, 40.78 ] }, name: "La Guardia Airport", category : "Airport" } ] )
2dsphere
インデックスの作成
次の操作は、ロケーション フィールドloc
に2dsphereインデックスを作成します。
db.places.createIndex( { loc : "2dsphere" } )
インデックス キーを使用した複合インデックスの作成2dsphere
複合インデックスには、非地理空間インデックス キーと組み合わせて2dsphere
インデックス キーを含めることができます。 たとえば、次の操作では、最初のキーloc
が2dsphere
インデックス キーで、残りのキーcategory
とnames
が非地理空間インデックスキーで、具体的には降順( -1
)の複合インデックスが作成されます。それぞれと昇順( 1
)キーをサポートします。
db.places.createIndex( { loc : "2dsphere" , category : -1, name: 1 } )
2dインデックスとは異なり、複合2dsphere
インデックスではロケーション フィールドが最初にインデックス付けされるフィールドである必要は ありません 。 例:
db.places.createIndex( { category : 1 , loc : "2dsphere" } )