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