Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/

2dsphere Indexes

Nesta página

  • Visão geral
  • Versões
  • Considerações
  • Crie um índice 2dsphere

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.

2dsphere Versão do Índice
Descrição

Versão 3

O MongoDB 3.2 introduz uma versão 3 de índices do 2dsphere . A versão 3 é a versão padrão dos índices 2dsphere criados no MongoDB 3.2 e versões posteriores.

Versão 2

O MongoDB 2.6 introduz uma versão 2 de índices do 2dsphere . A versão 2 é a versão padrão dos índices 2dsphere criados nas séries MongoDB 2.6 e 3.0.

Para substituir a versão padrão e especificar uma versão diferente, inclua a opção { "2dsphereIndexVersion": <version> } ao criar o índice.

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.

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.

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ção key para especificar o caminho do campo a ser usado.

  • Se você não especificar o key, não poderá ter vários índices 2dsphere e/ou vários índices 2d , pois sem o key, a seleção de índices entre vários índices 2d ou índices 2dsphere é 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.

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.

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

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

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"
}
] )

A seguinte operação cria um índice 2dsphere no campo de localização loc :

db.places.createIndex( { loc : "2dsphere" } )

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" } )

Voltar

Restrições de índice curinga