MongoDBは、地理空間クエリをサポートする次の地理空間インデックスタイプを提供します。
- 2dインデックスは、2次元平面上のジオメトリを計算するクエリをサポートします。
-
2dsphere
インデックスは、地球のような球のジオメトリを計算するクエリをサポートしています。
この記事では、2dsphere
を作成します インデックス。
サンプルコレクション
bars
というコレクションがあるとします。 次のドキュメントを使用:
{ "_id" : 1, "name" : "Boardwalk Social", "location" : { "type" : "Point", "coordinates" : [ 145.77675259719823, -16.919297718553366 ] } } { "_id" : 2, "name" : "The Downunder Bar", "location" : { "type" : "Point", "coordinates" : [ 145.77621640842125, -16.92107838010542 ] } } { "_id" : 3, "name" : "Riley", "location" : { "type" : "Point", "coordinates" : [ 145.7739955395154, -16.916028253292883 ] } } { "_id" : 4, "name" : "Salt House", "location" : { "type" : "Point", "coordinates" : [ 145.78148426655065, -16.91823513430776 ] } } { "_id" : 5, "name" : "Rattle n Hum", "location" : { "type" : "Point", "coordinates" : [ 145.77746095331537, -16.920051942529685 ] } }
各ドキュメントには、GeoJSONオブジェクトとして保存された位置情報があります。
GeoJSONオブジェクトには、type
という名前のフィールドがあります GeoJSONオブジェクトタイプとcoordinates
という名前のフィールドを指定します オブジェクトの座標を指定します。
2dsphereインデックスを作成する
それでは、2dsphere
を作成しましょう。 インデックス。
db.bars.createIndex( { location : "2dsphere" } )
出力:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
2dsphere
これでインデックスが作成されました。
これで、getIndexes()
を使用できます インデックスを確認する方法:
db.bars.getIndexes()
結果:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "location" : "2dsphere" }, "name" : "location_2dsphere", "2dsphereIndexVersion" : 3 } ]
インデックスが2dsphere
として作成されたことがわかります 2dsphereIndexVersion
を使用したインデックス 3
の 、これは私の現在のMongoDBインストール(4.4)のデフォルトバージョンです。
複合2dsphereインデックスを作成する
2dsphere
を含めることができます 非地理空間インデックスキーと組み合わされた複合インデックスのインデックスキー。
たとえば、location
を組み合わせることができます name
のフィールド 複合インデックスを作成するフィールド。
インデックスを削除して、複合インデックスを作成しましょう:
db.bars.dropIndex("location_2dsphere")
db.bars.createIndex( { location : "2dsphere", name : 1 } )
出力:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
そして、インデックスを確認してください:
db.bars.getIndexes()
結果:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "location" : "2dsphere", "name" : 1 }, "name" : "location_2dsphere_name_1", "2dsphereIndexVersion" : 3 } ]
複合2dsphere
インデックスは、複数の場所フィールドと非場所フィールドを参照できます。これは、複合2d
とは対照的です。 インデックス。1つのロケーションフィールドと他の1つのフィールドのみを参照するように制限されています。
2dsphereIndexVersionの変更
2dsphereIndexVersion
を変更できます インデックスを作成するときに、目的の値を持つフィールドとして追加します。
例:
db.bars.createIndex(
{ location : "2dsphere" },
{ "2dsphereIndexVersion" : 2 }
)
出力:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
インデックスを確認してください:
db.bars.getIndexes()
結果:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "location" : "2dsphere" }, "name" : "location_2dsphere", "2dsphereIndexVersion" : 2 } ]
このインデックスは2dsphere
として作成されました インデックスバージョン2。
バージョン2は、2dsphere
のデフォルトバージョンです。 MongoDB2.6および3.0シリーズで作成されたインデックス。
バージョン3は、2dsphere
のデフォルトバージョンです。 MongoDB 3.2以降で作成されたインデックス(執筆時点)。
2dsphereIndexVersion
を指定せずにインデックスを作成したとき フィールドでは、バージョン3を使用してインデックスを作成しました。これは、バージョン3が私のMongoDBバージョン(4.4)のデフォルトバージョンであるためです。