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

2dsphere Indexes

項目一覧

  • Overview
  • バージョン
  • Considerations
  • 2dsphereインデックスの作成

2dsphereインデックスは、地球のような球体上のジオメトリを計算するクエリをサポートします。 2dsphereインデックスは、すべての MongoDB 地理空間クエリ(包含、交差、近接性のクエリ)をサポートしています。 地理空間クエリの詳細については、「 地理空間クエリ 」を参照してください。

2dsphereインデックスは、 GeoJSON オブジェクトlegacy coordinate pairsとして保存されたデータをサポートしています( 2dsphereインデックス付きフィールド制限も参照してください)。 legacy coordinate pairsの場合、インデックスはデータを GeoJSON Pointに変換します。

2dsphere インデックス バージョン
説明

バージョン 3

MongoDB 3.2 では、 2dsphereインデックスのバージョン 3 が導入されています。 バージョン 3 は、MongoDB 3.2 以降で作成された2dsphereインデックスのデフォルト バージョンです。

バージョン 2

MongoDB 2.6 では、 2dsphereインデックスのバージョン 2 が導入されています。 バージョン 2 は、MongoDB 2.6 および 3.0 シリーズで作成された2dsphereインデックスのデフォルト バージョンです。

デフォルト バージョンを上書きして別のバージョンを指定するには、インデックスの作成時にオプション{ "2dsphereIndexVersion": <version> }を含めます。

バージョン 2 以降の2dsphereインデックスは常にスパースで、スパースオプションを無視します。 ドキュメントに2dsphereインデックス フィールドがない場合(またはフィールドがnullまたは空の配列である場合)、MongoDB はドキュメントのエントリーをインデックスに追加しません。 挿入の場合、MongoDB はドキュメントを挿入しますが、 2dsphereインデックスには追加しません。

2dsphereインデックス キーと他のタイプのキーを含む複合インデックスの場合、インデックスがドキュメントを参照するかどうかは、 2dsphereインデックス フィールドのみによって決定します。

MongoDB の以前のバージョンは2dsphere (Version 1)インデックスのみをサポートしていました。 2dsphere (Version 1)インデックスはデフォルトではスパースではなくnullのロケーション フィールドを持つドキュメントを拒否します。

バージョン 2 以降の2dsphereインデックスには、追加の GeoJSON オブジェクト( MultiPointMultiLineStringMultiPolygonGeometryCollection )のサポートが含まれています。 サポートされているすべての GeoJSON オブジェクトの詳細については、 「 GeoJSON オブジェクト」 を参照してください。

使用するインデックス付きフィールドパスを示すには、 $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インデックスを持つフィールドには、座標ペアまたはGeoJSONデータの形式でジオメトリ データを格納する必要があります。 2dsphereインデックス付きフィールドにジオメトリデータ以外のデータを含むドキュメントを挿入しようとしたり、インデックス付きフィールドにジオメトリ以外のデータが含まれているコレクションに2dsphereインデックスを構築しようとしたりすると、操作は失敗します。

2dsphere インデックスのキーを生成するために、mongodGeoJSON シェイプを内部表現にマッピングします。結果として得られる内部表現は、値の大きな配列になる可能性があります。

mongodが配列を保持するフィールドにインデックス キーを生成する場合、mongodは配列要素ごとにインデックス キーを生成します。複合インデックスの場合、mongodは各フィールドに対して生成されたキーセットの直積集合を計算します。両方のセットが大きい場合、直積集合の計算によって操作がメモリ制限を超える可能性があります。

indexMaxNumGeneratedKeysPerDocumentは、メモリ不足エラーを防ぐために、単一のドキュメントに対して生成されるキーの最大数を制限します。デフォルトは 1 ドキュメントあたり 100000 インデックス キーです。制限を引き上げることは可能ですが、indexMaxNumGeneratedKeysPerDocumentパラメーターで指定された数より多くのキーが操作に必要な場合、操作は失敗します。

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

次の操作は、ロケーション フィールドloc2dsphereインデックスを作成します。

db.places.createIndex( { loc : "2dsphere" } )

複合インデックスには、非地理空間インデックス キーと組み合わせて2dsphereインデックス キーを含めることができます。 たとえば、次の操作では、最初のキーloc2dsphereインデックス キーで、残りのキーcategorynamesが非地理空間インデックスキーで、具体的には降順( -1 )の複合インデックスが作成されます。それぞれと昇順( 1 )キーをサポートします。

db.places.createIndex( { loc : "2dsphere" , category : -1, name: 1 } )

2dインデックスとは異なり、複合2dsphereインデックスではロケーション フィールドが最初にインデックス付けされるフィールドである必要は ありません 。 例:

db.places.createIndex( { category : 1 , loc : "2dsphere" } )

戻る

ワイルドカード インデックスの制限