Este documento explica los pormenores de 2d índices. Este material no es necesario para las operaciones normales o el desarrollo de aplicaciones, pero puede ser útil para la resolución de problemas y para una mayor comprensión.
Geohash Values
Al crear un índice geoespacial en un campo que contiene legacy coordinate pairs, MongoDB calcula los valores geohash para los pares de coordenadas dentro del rango de ubicaciones especificado y luego indexa estos valores geohash.
Para calcular un valor de geohash, MongoDB divide recursivamente un mapa bidimensional en cuadrantes. Luego, asigna a cada cuadrante un valor de dos bits. Por ejemplo, una representación de dos bits de cuatro cuadrantes sería la siguiente:
01 11 00 10
Estos valores de dos bits (0001, 10, y 11) representan cada uno de los cuadrantes y todos los puntos dentro de cada uno de ellos. Cada cuadrante tiene un valor de geohash correspondiente:
Cuadrante | geohash |
|---|---|
Abajo a la izquierda |
|
Esquina superior izquierda |
|
Abajo a la derecha |
|
Arriba a la derecha |
|
Para proporcionar una precisión adicional, MongoDB puede dividir cada cuadrante en sub-cuadrantes. Cada subcuadrante tiene el valor geohash del cuadrante contenedor concatenado con el valor del subcuadrante. Por ejemplo, el geohash para el cuadrante superior derecho es 11, y el geohash para los subcuadrantes sería (en el sentido de las agujas del reloj desde la esquina superior izquierda):
1101111111101100
Documentos de múltiples ubicaciones para índices 2D
Si bien los índices 2d no admiten más de un campo de ubicación en un documento, se puede usar un índice multiclave para indexar múltiples pares de coordenadas en un solo documento. Por ejemplo, en el siguiente documento, el campo locs contiene un arreglo de pares de coordenadas:
db.places.insertOne( { locs : [ [ 55.5 , 42.3 ], [ -74 , 44.74 ], { long : 55.5 , lat : 42.3 } ] } )
Los valores en el arreglo locs pueden ser:
Arreglos, como en
[ 55.5, 42.3 ].Documentos incrustados, como en
{ long : 55.5 , lat : 42.3 }.
Para indexar todos los pares de coordenadas en el arreglo locs, crea un índice 2d en el campo locs:
db.places.createIndex( { "locs": "2d" } )
Documentos Multi-Ubicación Integrados
Puedes almacenar datos de ubicación como un campo dentro de un documento incrustado. Por ejemplo, se puede tener un arreglo de documentos incrustados donde cada documento incrustado tiene un campo que contiene datos de ubicación.
En el siguiente documento, el campo addresses es un arreglo de documentos incrustados. Los documentos incrustados contienen un campo loc, que es un 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 los valores loc en el arreglo addresses, crea un índice 2d en el campo addresses.loc:
db.records.createIndex( { "addresses.loc": "2d" } )