2d
Internos do índice
Nesta página
Este documento fornece uma explicação mais detalhada do conteúdo interno dos índices geoespaciais 2d
do MongoDB. Este material não é necessário para operações normais ou desenvolvimento de aplicativos, mas pode ser útil para solução de problemas e para maior compreensão.
Cálculo de valores de geohash para 2d
índices
Quando você cria um índice geoespacial em legacy coordinate pairs, o MongoDB calcula valores de geohash para os pares de coordenadas dentro do intervalo de localização especificado e então indexa os valores de geohash .
Para calcular um valor de geohash, divida recursivamente um mapa bidimensional em segundo plano. Em seguida, atribua a cada quadrado um valor de dois bits. Por exemplo, uma representação de dois bits de quatro blocos seria:
01 11 00 10
Estes valores de dois bits (00
, 01
, 10
e 11
) representam cada um dos bloco e todos os pontos dentro de cada bloco. Para um geohash com dois bits de resolução, todos os pontos no bloco inferior esquerdo teriam um geohash de 00
. O bloco superior esquerdo teria o geohash de 01
. O canto inferior direito e o canto superior direito teriam um geohash de 10
e 11
, respectivamente.
Para fornecer precisão adicional, continue dividindo cada bloco em subquadrantes. Cada sub-quadrante teria o valor de geohash do campos contendo concatenado com o valor do sub-quadrante. O geohash para o bloco superior direito é 11
, e o geohash para os subquadrantes seria (no sentido horário a partir do canto superior esquerdo): 1101
, 1111
, 1110
e 1100
, respectivamente.
Documentos de múltiplas localizações para 2d
índices
Observação
Embora os índices geoespaciais 2d
não suportem mais de um campo geoespacial em um documento, você pode utilizar um índice de múltiplas chaves para indexar múltiplos pares de coordenadas em um único documento. No exemplo mais simples, você pode ter um campo (por exemplo locs
) que contém uma array de coordenadas, como no exemplo a seguir:
db.places.save( { locs : [ [ 55.5 , 42.3 ] , [ -74 , 44.74 ] , { lng : 55.5 , lat : 42.3 } ] } )
Os valores da array podem ser arrays, como em [ 55.5, 42.3 ]
, ou documentos incorporados, como em { lng : 55.5 , lat : 42.3 }
.
Você pode então criar um índice geoespacial no campo locs
, como no seguinte:
db.places.createIndex( { "locs": "2d" } )
Você também pode modelar os dados de localização como um campo dentro de um documento incorporado. Nesse caso, o documento conteria um campo (por exemplo, addresses
) que contém uma matriz de documentos onde cada documento tem um campo (por exemplo loc:
) que contém coordenadas de localização. Por exemplo:
db.records.save( { name : "John Smith", addresses : [ { context : "home" , loc : [ 55.5, 42.3 ] } , { context : "work", loc : [ -74 , 44.74 ] } ] } )
Você pode então criar o índice geoespacial no campo addresses.loc
como no seguinte exemplo:
db.records.createIndex( { "addresses.loc": "2d" } )