O MongoDB fornece os seguintes tipos de índice geoespacial que suportam consultas geoespaciais.
- Os índices 2D são compatíveis com consultas que calculam geometrias em um plano bidimensional.
2dsphere
os índices são compatíveis com consultas que calculam geometrias em uma esfera semelhante à Terra.
Neste artigo, crio um
2dsphere
índice. Coleção de exemplo
Suponha que tenhamos uma coleção chamada
bars
com os seguintes documentos:{ "_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 ] } }
Cada documento tem informações de localização armazenadas como um objeto GeoJSON.
Um objeto GeoJSON tem um campo chamado
type
que especifica o tipo de objeto GeoJSON e um campo chamado coordinates
que especifica as coordenadas do objeto. Criar o índice 2dsphere
Agora vamos criar o
2dsphere
índice. db.bars.createIndex( { location : "2dsphere" } )
Saída:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
A
2dsphere
índice já foi criado. Agora podemos usar o
getIndexes()
método para verificar nosso índice:db.bars.getIndexes()
Resultado:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "location" : "2dsphere" }, "name" : "location_2dsphere", "2dsphereIndexVersion" : 3 } ]
Podemos ver que o índice foi criado como um
2dsphere
index, usando 2dsphereIndexVersion
de 3
, que é a versão padrão para minha instalação atual do MongoDB (4.4). Criar um Índice 2dsphere Composto
Você pode incluir
2dsphere
chaves de índice em índices compostos que são combinados com chaves de índice não geoespaciais. Por exemplo, poderíamos ter combinado nossa
location
campo com o name
campo para criar um índice composto. Vamos descartar o índice e criar um índice composto:
db.bars.dropIndex("location_2dsphere")
db.bars.createIndex( { location : "2dsphere", name : 1 } )
Saída:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
E verifique o índice:
db.bars.getIndexes()
Resultado:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "location" : "2dsphere", "name" : 1 }, "name" : "location_2dsphere_name_1", "2dsphereIndexVersion" : 3 } ]
Composto
2dsphere
os índices podem fazer referência a vários campos de local e não local. Isso contrasta com o composto 2d
índices, que se limitam a referenciar apenas um campo de localização e um outro campo. Alterando a 2dsphereIndexVersion
Você pode alterar o
2dsphereIndexVersion
adicionando-o como um campo com o valor desejado ao criar o índice. Exemplo:
db.bars.createIndex(
{ location : "2dsphere" },
{ "2dsphereIndexVersion" : 2 }
)
Saída:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
Confira o índice:
db.bars.getIndexes()
Resultado:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "location" : "2dsphere" }, "name" : "location_2dsphere", "2dsphereIndexVersion" : 2 } ]
Este índice foi criado como um
2dsphere
versão do índice 2. A versão 2 é a versão padrão do
2dsphere
índices criados nas séries MongoDB 2.6 e 3.0. A versão 3 é a versão padrão do
2dsphere
índices criados no MongoDB 3.2 e posterior (no momento da escrita). Quando criei o índice sem especificar o
2dsphereIndexVersion
campo, ele criou o índice usando a versão 3, porque essa é a versão padrão para minha versão do MongoDB (4.4).