Internos do índice 2d
Nesta página
Este documento explica os componentes internos dos2 d. Este material não é necessário para operações normais ou desenvolvimento de aplicação , mas pode ser útil para solução de problemas e para maior compreensão.
Valores de geohash
Quando você cria um índice geoespacial em um campo que contém pares de coordenadas legadas , o MongoDB calcula valores de geohash para os pares de coordenadas dentro da faixa de localização especificada e, em seguida, indexa os valores de geohash.
Para calcular um valor de geohash, o MongoDB divide recursivamente um mapa bidimensional em bloco. Em seguida, ele atribui a cada quadrado um valor de dois bits. Por exemplo, uma representação de dois bits de quatro ângulos seria:
01 11 00 10
Esses valores de dois bits (00
, 01
, 10
e 11
) representam cada um dos bloco e todos os pontos dentro de cada bloco. Cada quadrado tem um valor de geohash correspondente:
PLATAFORMA | geohash |
---|---|
Inferior esquerdo | 00 |
Canto superior esquerdo | 01 |
Canto inferior direito | 10 |
Canto superior direito | 11 |
Para fornecer precisão adicional, o MongoDB pode dividir cada lote em subquadrantes. Cada sub-quadrante tem o valor de geohash do quadrados que o contém concatenado com o valor do sub-quadrante. Por exemplo, 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
1100
documento de várias localizações para índices 2d
Embora os índices 2d não ofereçam suporte a mais de um campo de localização em um documento, você pode usar um índice de várias chaves para indexar vários pares de coordenadas em um único documento. Por exemplo, no documento a seguir, o campo locs
contém uma array de pares de coordenadas:
db.places.insertOne( { locs : [ [ 55.5 , 42.3 ], [ -74 , 44.74 ], { long : 55.5 , lat : 42.3 } ] } )
Os valores na array locs
podem ser:
Arrays, como em
[ 55.5, 42.3 ]
.documento incorporado, como em
{ long : 55.5 , lat : 42.3 }
.
Para indexar todos os pares de coordenadas na array locs
, crie um índice 2d no campo locs
:
db.places.createIndex( { "locs": "2d" } )
documento incorporados de vários locais
Você pode armazenar dados de localização como um campo dentro de um documento incorporado. Por exemplo, você pode ter uma array de documentos incorporados, onde cada documento incorporado tem um campo que contém dados de localização.
No documento a seguir, o campo addresses
é uma array de documentos incorporados. Os documentos incorporados contêm um campo loc
, que é um par de coordenadas:
db.records.insertOne( { name : "John Smith", addresses : [ { context : "home" , loc : [ 55.5, 42.3 ] }, { context : "work", loc : [ -74 , 44.74 ] } ] } )
Para indexar todos os valores de loc
na array addresses
, crie um índice 2d no campo addresses.loc
:
db.records.createIndex( { "addresses.loc": "2d" } )