MongoDB udostępnia następujące typy indeksów geoprzestrzennych, które obsługują zapytania geoprzestrzenne.
- Indeksy 2d obsługują zapytania, które obliczają geometrie na płaszczyźnie dwuwymiarowej.
2dsphere
indeksy obsługują zapytania, które obliczają geometrie na kuli podobnej do Ziemi.
W tym artykule tworzę 2dsphere
indeks.
Przykładowa kolekcja
Załóżmy, że mamy kolekcję o nazwie bars
z następującymi dokumentami:
{ "_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 ] } }
Każdy dokument zawiera informacje o lokalizacji przechowywane jako obiekt GeoJSON.
Obiekt GeoJSON ma pole o nazwie type
który określa typ obiektu GeoJSON i pole o nazwie coordinates
który określa współrzędne obiektu.
Utwórz indeks 2dsphere
Teraz utwórzmy 2dsphere
indeks.
db.bars.createIndex( { location : "2dsphere" } )
Wyjście:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
2dsphere
indeks został utworzony.
Możemy teraz użyć getIndexes()
metoda sprawdzenia naszego indeksu:
db.bars.getIndexes()
Wynik:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "location" : "2dsphere" }, "name" : "location_2dsphere", "2dsphereIndexVersion" : 3 } ]
Widzimy, że indeks został utworzony jako 2dsphere
indeks, używając 2dsphereIndexVersion
z 3
, która jest domyślną wersją mojej obecnej instalacji MongoDB (4.4).
Utwórz złożony indeks 2dsphere
Możesz dołączyć 2dsphere
klucze indeksu w indeksach złożonych, które są połączone z kluczami indeksu niegeoprzestrzennymi.
Na przykład moglibyśmy połączyć naszą location
pole z name
pole, aby utworzyć indeks złożony.
Upuśćmy indeks i utwórzmy indeks złożony:
db.bars.dropIndex("location_2dsphere")
db.bars.createIndex( { location : "2dsphere", name : 1 } )
Wyjście:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
I sprawdź indeks:
db.bars.getIndexes()
Wynik:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "location" : "2dsphere", "name" : 1 }, "name" : "location_2dsphere_name_1", "2dsphereIndexVersion" : 3 } ]
Złożona 2dsphere
indeksy mogą odwoływać się do wielu pól lokalizacji i pól niezwiązanych z lokalizacją. To jest w przeciwieństwie do złożonego 2d
indeksy, które są ograniczone do odwoływania się tylko do jednego pola lokalizacji i jednego innego pola.
Zmiana wersji 2dsphereIndex
Możesz zmienić 2dsphereIndexVersion
dodając go jako pole z żądaną wartością podczas tworzenia indeksu.
Przykład:
db.bars.createIndex(
{ location : "2dsphere" },
{ "2dsphereIndexVersion" : 2 }
)
Wyjście:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
Sprawdź indeks:
db.bars.getIndexes()
Wynik:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "location" : "2dsphere" }, "name" : "location_2dsphere", "2dsphereIndexVersion" : 2 } ]
Ten indeks został utworzony jako 2dsphere
indeks wersja 2.
Wersja 2 to domyślna wersja 2dsphere
indeksy utworzone w MongoDB serii 2.6 i 3.0.
Wersja 3 to domyślna wersja 2dsphere
indeksy utworzone w MongoDB 3.2 i nowszych (w momencie pisania).
Kiedy utworzyłem indeks bez określenia 2dsphereIndexVersion
pole, utworzył indeks przy użyciu wersji 3, ponieważ jest to domyślna wersja dla mojej wersji MongoDB (4.4).