Este documento proporciona una explicación más profunda de los aspectos internos de los índices geoespaciales de 2d de MongoDB. 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.
Cálculo de los valores de Geohash para 2d índices
Cuando se crea un índice geoespacial en legacy coordinate pairs, MongoDB calcula valores geohash para los pares de coordenadas dentro del rango de ubicación especificado y luego indexa los valores geohash.
Para calcular un valor de geohash, 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:
01 11 00 10
Estos valores de dos bits (00, 01, 10 y 11) representan cada uno de los cuadrantes y todos los puntos dentro de cada cuadrante. Para un geohash con dos bits de resolución, todos los puntos en el cuadrante inferior izquierdo tendrían un geohash de 00. El cuadrante superior izquierdo tendría el geohash de 01. La parte inferior derecha y la parte superior derecha tendrían un geohash de 10 y 11, respectivamente.
Para proporcionar una mayor precisión, continué dividiendo cada cuadrante en subcuadrantes. Cada subcuadrante tendría el valor geohash del cuadrante contenedor concatenado con el valor del subcuadrante. 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 parte superior izquierda): 1101, 1111, 1110 y 1100, respectivamente.
Documentos de múltiples 2d ubicaciones para índices
Nota
Aunque 2d los índices geoespaciales no admiten más de un campo geoespacial en un documento, se puede usar un índice multiclave para indexar varios pares de coordenadas en un mismo documento. En el ejemplo más simple, se podría tener un campo (p. ej.,)locs que contenga una matriz de coordenadas, como en el siguiente ejemplo:
db.places.save( { locs : [ [ 55.5 , 42.3 ] , [ -74 , 44.74 ] , { lng : 55.5 , lat : 42.3 } ] } )
Los valores de la matriz pueden ser matrices, como en [ 55.5, 42.3 ], o documentos incrustados, como en { lng : 55.5 , lat : 42.3 }.
Luego podría crear un índice geoespacial en el campo locs, como en el siguiente:
db.places.createIndex( { "locs": "2d" } )
También puedes modelar los datos de la ubicación como un campo dentro de un documento incrustado. En este caso, el documento contendría un campo (por ejemplo, addresses) que contiene un arreglo de documentos donde cada documento tiene un campo (por ejemplo, loc:) que contiene coordenadas de ubicación. Por ejemplo:
db.records.save( { name : "John Smith", addresses : [ { context : "home" , loc : [ 55.5, 42.3 ] } , { context : "work", loc : [ -74 , 44.74 ] } ] } )
Podrías entonces crear el índice geoespacial en el campo addresses.loc, como se muestra en el siguiente ejemplo:
db.records.createIndex( { "addresses.loc": "2d" } )