MongoDB предоставя следните типове геопространствени индекси, които поддържат геопространствени заявки.
- 2d индексите поддържат заявки, които изчисляват геометрии в двуизмерна равнина.
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 индекси, които са ограничени до препращане само към едно поле за местоположение и едно друго поле.
Промяна на 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 индекси, създадени в сериите MongoDB 2.6 и 3.0.
Версия 3 е версията по подразбиране на 2dsphere индекси, създадени в MongoDB 3.2 и по-нови (към момента на писане).
Когато създадох индекса, без да посоча 2dsphereIndexVersion поле създаде индекса, използвайки версия 3, защото това е версията по подразбиране за моята версия на MongoDB (4.4).