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