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.
2dsphereindeksy 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).