地理空間インデックスの制限
2 dと2 dsphereインデックスは地理空間インデックスです。 地理空間インデックスには次の制限があります。
照合オプション
2 d インデックスは照合オプションをサポートしておらず、バイナリ比較のみをサポートします。 バイナリ比較では、各 string 内の各文字の数値 Unicode 値が比較され、大文字と小文字またはアクセント記号は考慮されません。
単純ではない照合順序を持つコレクションに 2d インデックスを作成するには、インデックスの作成時に { collation: { locale: "simple"
} }
を明示的に指定する必要があります。
たとえば、照合順序が{ locale: "en" }
である、 collationTest
という名前のコレクションを考えてみましょう。
db.createCollection( "collationTest", { collation: { locale: "en" } } )
collationTest
コレクションに 2D インデックスを作成するには、 { collation: { locale: "simple" } }
を指定する必要があります。 このコマンドは、 loc
フィールドに 2D インデックスを作成します。
db.collationTest.createIndex( { loc: "2d" }, { collation: { locale: "simple" } } )
カバード クエリ
地理空間インデックスは、 クエリをカバー できません。
シャードキー
地理空間インデックスをシャードキーとして使用することはできません。 ただし、別のフィールドをシャードキーとして使用して、シャーディングされたコレクションに地理空間インデックスを作成することはできます。
を使用した複数の地理空間インデックス $geoNear
コレクションに複数の地理空間インデックスがある場合は、 $geoNear
パイプライン ステージを実行するときに、 $geoNear
key
オプションを指定する必要があります。 key
オプションは、クエリをサポートするために使用するインデックスを指定します。
サポートされているデータ型
2 dsphere インデックスでインデックス付けされたフィールドにはジオメトリ データが含まれている必要があります。 形状データは次のいずれかになります。
次の操作はできません。
2 dsphere インデックスでインデックス付けされているフィールドに非ジオメトリ データを含むドキュメントを挿入します。
非ジオメトリ データを含むフィールドに2 dsphere インデックスを構築します。
インデックス キーの数
2 dsphere インデックスを作成すると、 mongod
はGeoJSON シェイプを内部表現にマッピングします。 結果として得られる内部表現は、値の大きな配列になる可能性があります。
indexMaxNumGeneratedKeysPerDocument
設定は、メモリ不足エラーを防ぐために、単一のドキュメントに対して生成されるキーの最大数を制限します。 If an operation requires more keys than the indexMaxNumGeneratedKeysPerDocument
parameter specifies, the operation fails.
デフォルトでは、サーバーではドキュメントごとに最大100,000
のインデックス キーが許可されます。 より多くのインデックス キーを許可するには、 indexMaxNumGeneratedKeysPerDocument
の値を引き上げます。
平面での完全一致
2 d インデックスでは、座標ペアでの完全一致のパフォーマンスは向上しません。
たとえば、以下のドキュメントのあるcontacts
コレクションを考えます。
db.contacts.insertMany( [ { name: "Evander Otylia", phone: "202-555-0193", address: [ 55.5, 42.3 ] }, { name: "Georgine Lestaw", phone: "714-555-0107", address: [ -74, 44.74 ] } ] )
address
フィールドに2 d インデックスを使用しても、次のクエリのパフォーマンスは向上しません。
db.contacts.find( { address: [ 55.5, 42.3 ] } )
このクエリのパフォーマンスを向上させるには、 address
フィールドに昇順または降順のインデックスを作成します。
db.contacts.createIndex( { address: 1 } )