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 2d , 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á.
Número limitado de chaves de índice
Para gerar chaves para um índice 2dsphere, mongod
mapeia formas GeoJSON para uma representação interna. A representação interna resultante pode ser uma grande array de valores.
Quando mongod
gera chaves de índice em um campo que contém uma array, mongod
gera uma chave de índice para cada elemento da array. Para índices compostos, o mongod
calcula o produto cartesiano dos conjuntos de chaves que são geradas para cada campo. Se ambos os conjuntos forem grandes, o cálculo do produto cartesiano poderá fazer com que a operação exceda os limites de memória.
indexMaxNumGeneratedKeysPerDocument
limita o número máximo de chaves geradas para um único documento para evitar erros de falta de memória. O padrão é 100000 chaves de índice por documento. É possível aumentar o limite, mas se uma operação exigir mais chaves do que o parâmetro indexMaxNumGeneratedKeysPerDocument
especifica, 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" } )