2dsphere
Indexes
Visão geral
Um índice do 2dsphere
suporta queries que calculam geometrias em uma esfera semelhante à Terra. O índice 2dsphere
suporta todas as queries geoespaciais MongoDB : queries para inclusão, interseção e proximidade. Para mais informações sobre queries geoespaciais, consulte queries geoespaciais.
O índice 2dsphere
suporta dados armazenados como objetosGeoJSON e legacy coordinate pairs (consulte também 2dsphere
Restrições de campos indexados). Para legacy coordinate pairs, o índice converte os dados para GeoJSON Point
.
Versões
2dsphere Versão do Índice | Descrição |
---|---|
Versão 3 | O MongoDB 3.2 introduz uma versão 3 de índices do |
Versão 2 | O MongoDB 2.6 introduz uma versão 2 de índices do |
Para substituir a versão padrão e especificar uma versão diferente, inclua a opção { "2dsphereIndexVersion": <version> }
ao criar o índice.
sparse
Propriedade
Os índices 2dsphere
versão 2 e posteriores são sempre escassos e ignoram a opção esparsa . Se um documento não tiver um campo de índice 2dsphere
(ou o campo for null
ou uma array vazia), o MongoDB não adicionará uma entrada para o documento ao índice. Para inserções, o MongoDB insere o documento, mas não adiciona ao índice 2dsphere
.
Para um índice composto que inclui uma chave de índice 2dsphere
junto com chaves de outros tipos, somente o campo de índice 2dsphere
determina se o índice faz referência a um documento.
Versões anteriores do MongoDB suportam apenas índices 2dsphere (Version 1)
. Os índices 2dsphere (Version 1)
não são escassos por padrão e rejeitarão documentos com null
campos de localização.
Objetos GeoJSON adicionais
A versão 2 e os índices 2dsphere
posteriores incluem suporte para objetos GeoJSON adicionais: MultiPoint
, MultiLineString
, MultiPolygon
e GeometryCollection
. Para detalhes sobre todos os objetos GeoJSON suportados, consulte Objetos GeoJSON.
Considerações
geoNear
e $geoNear
restrições
Você pode especificar uma opção key
para o estágio de pipeline $geoNear
para indicar o caminho do campo indexado a ser usado. Isso permite que o estágio $geoNear
seja usado em uma collection que tenha vários índices 2dsphere
e/ou vários índices 2d :
Se a sua collection tiver vários índices
2dsphere
e/ou vários índices 2d , você deverá usar a opçãokey
para especificar o caminho do campo a ser usado.Se você não especificar o
key
, não poderá ter vários índices2dsphere
e/ou vários índices 2d , pois sem okey
, a seleção de índices entre vários índices2d
ou índices2dsphere
é ambígua.
Observação
Se você não especificar key
e tiver no máximo apenas um índice 2dsphere
e/ou apenas um índice 2dsphere
, o MongoDB procurará primeiro um índice 2d
para usar. Se um índice 2d
não existir, o MongoDB procurará um índice 2dsphere
para usar.
Restrições da chave de fragmento
Não é possível usar um índice 2dsphere
como chave de shard ao fragmentar uma coleção. No entanto, você pode criar um índice geoespacial em uma coleção fragmentada utilizando um campo diferente como a chave fragmentada.
2dsphere
Restrições de campos indexados
Campos com índices 2dsphere devem conter dados geométricos na forma de pares de coordenadas ou dados GeoJSON . Se você tentar inserir um documento com dados não geométricos em um campo indexado do 2dsphere
ou construir um índice do 2dsphere
em uma collection onde o campo indexado tem dados não geométricos, a operação falhará.
Criar um 2dsphere
índice
Para criar um índice do 2dsphere
, utilize o método db.collection.createIndex()
e especifique a string literal "2dsphere"
como o tipo de índice:
db.collection.createIndex( { <location field> : "2dsphere" } )
onde o <location field>
é um campo cujo valor é um objeto GeoJSON ou um par de coordenadas legado.
Observação
Se você tentar criar um índice em um campo que contém uma matriz de pontos dogeoJSON, a construção do índice falhará e retornará o seguinte erro:
MongoServerError: Index build failed
Ao contrário de um índice composto 2d que pode referenciar um campo de localização e um outro campo, um índice composto 2dsphere
pode referenciar vários campos de localização e não localização.
Para os seguintes exemplos, considere uma collection places
com documento que armazenam dados de localização como ponto GeoJSON em um campo loc
:
db.places.insertMany( [ { loc : { type: "Point", coordinates: [ -73.97, 40.77 ] }, name: "Central Park", category : "Parks" }, { loc : { type: "Point", coordinates: [ -73.88, 40.78 ] }, name: "La Guardia Airport", category : "Airport" } ] )
Criar um 2dsphere
índice
A seguinte operação cria um índice 2dsphere no campo de localização loc
:
db.places.createIndex( { loc : "2dsphere" } )
Criar um índice composto com 2dsphere
chave de índice
Um índice composto pode incluir uma chave de índice 2dsphere
em combinação com chaves de índice não geoespaciais. Por exemplo, a seguinte operação cria um índice composto onde a primeira chave loc
é uma chave de índice 2dsphere
e as chaves restantes category
e names
são chaves de índice não geoespaciais, especificamente descendentes (-1
) e teclas ascendentes (1
), respectivamente.
db.places.createIndex( { loc : "2dsphere" , category : -1, name: 1 } )
Ao contrário do índice 2d , um índice composto 2dsphere
não exige que o campo de localização seja o primeiro campo indexado. Por exemplo:
db.places.createIndex( { category : 1 , loc : "2dsphere" } )