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 つしかない、もしくは2dsphere
インデックス インデックスが 1 つしかない場合、または両方ある場合、MongoDB は使用する2d
インデックスを最初に探します。 2d
インデックスが存在しない場合、MongoDB は使用する2dsphere
インデックスを探します。
シャードキーの制限
コレクションをシャーディングする場合、 2dsphere
インデックスをシャードキーとして使用することはできません。 ただし、別のフィールドをシャードキーとして使用して、シャーディングされたコレクションに地理空間インデックスを作成することはできます。
2dsphere
インデックス付きフィールドの制限
2dsphereインデックスを持つフィールドには、座標ペアまたはGeoJSONデータの形式でジオメトリ データを格納する必要があります。 2dsphere
インデックス付きフィールドにジオメトリデータ以外のデータを含むドキュメントを挿入しようとしたり、インデックス付きフィールドにジオメトリ以外のデータが含まれているコレクションに2dsphere
インデックスを構築しようとしたりすると、操作は失敗します。
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" } )