MongoDB proporciona los siguientes tipos de índices geoespaciales que admiten consultas geoespaciales.
- Los índices 2d admiten consultas que calculan geometrías en un plano bidimensional.
2dsphere
los índices admiten consultas que calculan geometrías en una esfera similar a la Tierra.
En este artículo, creo una 2dsphere
índice.
Colección de ejemplo
Supongamos que tenemos una colección llamada bars
con los siguientes documentos:
{ "_id" : 1, "name" : "Boardwalk Social", "location" : { "type" : "Point", "coordinates" : [ 145.77675259719823, -16.919297718553366 ] } } { "_id" : 2, "name" : "The Downunder Bar", "location" : { "type" : "Point", "coordinates" : [ 145.77621640842125, -16.92107838010542 ] } } { "_id" : 3, "name" : "Riley", "location" : { "type" : "Point", "coordinates" : [ 145.7739955395154, -16.916028253292883 ] } } { "_id" : 4, "name" : "Salt House", "location" : { "type" : "Point", "coordinates" : [ 145.78148426655065, -16.91823513430776 ] } } { "_id" : 5, "name" : "Rattle n Hum", "location" : { "type" : "Point", "coordinates" : [ 145.77746095331537, -16.920051942529685 ] } }
Cada documento tiene información de ubicación almacenada como un objeto GeoJSON.
Un objeto GeoJSON tiene un campo llamado type
que especifica el tipo de objeto GeoJSON y un campo llamado coordinates
que especifica las coordenadas del objeto.
Crear el índice de 2dsphere
Ahora vamos a crear la 2dsphere
índice.
db.bars.createIndex( { location : "2dsphere" } )
Salida:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
La 2dsphere
ahora se ha creado el índice.
Ahora podemos usar getIndexes()
método para comprobar nuestro índice:
db.bars.getIndexes()
Resultado:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "location" : "2dsphere" }, "name" : "location_2dsphere", "2dsphereIndexVersion" : 3 } ]
Podemos ver que el índice se creó como un 2dsphere
índice, usando 2dsphereIndexVersion
de 3
, que es la versión predeterminada de mi instalación actual de MongoDB (4.4).
Crear un índice compuesto de 2dsphere
Puede incluir 2dsphere
claves de índice en índices compuestos que se combinan con claves de índice no geoespaciales.
Por ejemplo, podríamos haber combinado nuestra location
campo con el name
campo para crear un índice compuesto.
Descartemos el índice y creemos un índice compuesto:
db.bars.dropIndex("location_2dsphere")
db.bars.createIndex( { location : "2dsphere", name : 1 } )
Salida:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
Y revisa el índice:
db.bars.getIndexes()
Resultado:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "location" : "2dsphere", "name" : 1 }, "name" : "location_2dsphere_name_1", "2dsphereIndexVersion" : 3 } ]
Compuesto 2dsphere
los índices pueden hacer referencia a múltiples campos de ubicación y no ubicación. Esto contrasta con el compuesto 2d
índices, que se limitan a hacer referencia a un solo campo de ubicación y a otro campo.
Cambiar la versión de 2dsphereIndex
Puede cambiar el 2dsphereIndexVersion
agregándolo como un campo con el valor deseado al crear el índice.
Ejemplo:
db.bars.createIndex(
{ location : "2dsphere" },
{ "2dsphereIndexVersion" : 2 }
)
Salida:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
Consulta el índice:
db.bars.getIndexes()
Resultado:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "location" : "2dsphere" }, "name" : "location_2dsphere", "2dsphereIndexVersion" : 2 } ]
Este índice ha sido creado como 2dsphere
índice versión 2.
La versión 2 es la versión predeterminada de 2dsphere
índices creados en las series MongoDB 2.6 y 3.0.
La versión 3 es la versión predeterminada de 2dsphere
índices creados en MongoDB 3.2 y versiones posteriores (en el momento de escribir este artículo).
Cuando creé el índice sin especificar el 2dsphereIndexVersion
campo, creó el índice usando la versión 3, porque esa es la versión predeterminada para mi versión de MongoDB (4.4).