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)のデフォルトバージョンであるためです。