MongoDB admite operaciones de query sobre datos geoespaciales. Esta sección presenta las características geoespaciales de MongoDB.
Compatibilidad
Puedes utilizar queries geoespaciales para implementaciones alojadas en los siguientes entornos:
MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube
MongoDB Enterprise: La versión basada en suscripción y autogestionada de MongoDB
MongoDB Community: La versión de MongoDB con código fuente disponible, de uso gratuito y autogestionada.
Para las implementaciones alojadas en MongoDB Atlas, puede ejecutar consultas geoespaciales en la interfaz de usuario mediante la consulta Filter Generador de barras o agregaciones. Para obtener más información, consulte Realizar consultas geoespaciales en Atlas.
Datos geoespaciales
En MongoDB puedes almacenar datos geoespaciales como objetos GeoJSON o como legacy coordinate pairs.
Objetos GeoJSON
Para calcular geometría sobre una esfera similar a la Tierra, almacene sus datos de ubicación como objetos GeoJSON.
Para especificar datos de GeoJSON, utilice un documento incrustado con:
un campo llamado
typeque especifica el tipo de objeto GeoJSON, yun campo llamado
coordinatesque especifica las coordenadas del objeto.
<field>: { type: <GeoJSON type> , coordinates: <coordinates> }
Importante
Si especifica coordenadas de longitud y latitud, enumera primero la longitud y luego la latitud.
Los valores de longitud válidos están entre
-180y180, ambos inclusive.Los valores de latitud válidos están entre
-90y90, ambos inclusive.
Por ejemplo, para especificar un punto GeoJSON:
location: { type: "Point", coordinates: [-73.856077, 40.848447] }
Para una lista de los objetos GeoJSON compatibles con MongoDB, así como ejemplos, vea GeoJSON objects.
Las consultas geoespaciales de MongoDB sobre objetos GeoJSON se calculan en una esfera; MongoDB utiliza el sistema de referencia WGS84 para consultas geoespaciales sobre objetos GeoJSON.
Legacy Coordinate Pairs
Para calcular distancias en un plano euclidiano, almacena los datos de ubicación como legacy coordinate pairs y usa un índice 2d. MongoDB admite cálculos de superficies esféricas en legacy coordinate pairs utilizando un índice2dsphere si conviertes manualmente los datos al tipo de punto GeoJSON.
Para especificar datos como legacy coordinate pairs, puede usar un arreglo (preferido) o un documento incrustado.
- Especifica mediante un arreglo (Preferido):
<field>: [ <x>, <y> ] Si especifica coordenadas de latitud y longitud, enumere primero la longitud y luego la latitud; es decir,
<field>: [<longitude>, <latitude> ] Los valores de longitud válidos están entre
-180y180, ambos inclusive.Los valores de latitud válidos están entre
-90y90, ambos inclusive.
- Especifique mediante un documento incrustado:
<field>: { <field1>: <x>, <field2>: <y> } Si especifica coordenadas de latitud y longitud, el primer campo, independientemente del nombre del campo, debe contener el valor de longitud y el segundo campo, el valor de latitud; es decir.
<field>: { <field1>: <longitude>, <field2>: <latitude> } Los valores de longitud válidos están entre
-180y180, ambos inclusive.Los valores de latitud válidos están entre
-90y90, ambos inclusive.
Para especificar pares de coordenadas heredadas, se prefieren los arreglos a un documento incrustado, ya que algunos lenguajes no ofrecen garantías de orden asociativo de los mapas.
Índices geoespaciales
MongoDB proporciona los siguientes tipos de índices geoespaciales para admitir las consultas geoespaciales.
2dsphere
Los índices 2dsphere admiten queries que calculan geometrías sobre una esfera similar a la Tierra.
Para crear un índice 2dsphere, utiliza el método db.collection.createIndex() y especifica el literal de cadena "2dsphere" como el tipo de índice:
db.collection.createIndex( { <location field> : "2dsphere" } )
en que el <location field> es un campo cuyo valor es un objeto GeoJSON o un par de coordenadas heredadas.
Nota
Si intenta crear un índice en un campo que contiene un arreglo de puntos geoJSON, la creación de índices falla y devuelve el siguiente error:
MongoServerError: Index build failed
Para obtener más información sobre el 2dsphere índice, consulte 2dsphere Índices.
2d
Los índices 2d admiten consultas que calculan geometrías en un plano bidimensional. Aunque el índice puede admitir queries $nearSphere que calculan sobre una esfera, siempre que sea posible, usa el índice 2dsphere para queries esféricas.
Para crear un índice 2d, utiliza el método db.collection.createIndex(), especificando el campo de ubicación como la clave y el literal de string "2d" como el tipo de índice:
db.collection.createIndex( { <location field> : "2d" } )
en el que <location field> es un campo cuyo valor es un par de coordenadas heredadas.
Para obtener más información sobre el 2d índice, consulte 2d Índices.
Índices geoespaciales y colecciones fragmentadas
No se puede usar un índice geoespacial como clave de fragmento al fragmentar una colección. Sin embargo, sí se puede crear un índice geoespacial en una colección fragmentada usando un campo diferente como clave de fragmento.
Las siguientes operaciones geoespaciales son compatibles con colecciones fragmentadas:
$geoNearetapa de agregación$neary$nearSphereoperadores del query
También puede consultar datos geoespaciales para un clúster fragmentado utilizando $geoWithin $geoIntersectsy.
Consultas cubiertas
Query geoespacial
Nota
Para consultas esféricas, utilice el resultado del índice 2dsphere.
El uso del índice 2d para consultas esféricas puede generar resultados incorrectos, como el uso del índice 2d para consultas esféricas que envuelven los polos.
Operadores del query geoespacial
MongoDB proporciona los siguientes operadores de consulta geoespacial:
Nombre | Descripción |
|---|---|
Selecciona geometrías que intercepten con una geometría GeoJSON. El índice 2dsphere admite | |
Selecciona geometrías dentro de una geometría GeoJSON delimitadora. Los índices 2dsphere y 2d son compatibles con | |
Devuelve objetos geoespaciales cercanos a un punto. Requiere un índice geoespacial. Los índices 2dsphere y 2d | |
Devuelve objetos geoespaciales cercanos a un punto de una esfera. Requiere un índice geoespacial. Los índices 2dsphere y 2d |
Para obtener más detalles, incluidos ejemplos, consulte la página de referencia individual.
Etapa de agregación geoespacial
MongoDB proporciona la siguiente etapa de la canalización de agregación geoespacial:
Etapa | Descripción |
|---|---|
Devuelve un flujo ordenado de documentos en función de la proximidad a un punto geoespacial. Incorpora la funcionalidad de
|
Para más detalles, incluidos ejemplos, consulta la página de referencia $geoNear.
Modelos geoespaciales
Las consultas geoespaciales de MongoDB pueden interpretar la geometría en una superficie plana o una esfera.
2dsphere los índices sólo ofrecen soporte para query esféricas (es decir, queries que interpretan geometrías sobre una superficie esférica).
2d los índices admiten queries planas (es decir, consultas que interpretan geometrías sobre una superficie plana) y algunas consultas esféricas. Aunque los índices 2d ofrecen soporte para algunas queries esféricas, el uso de índices 2d para estas queries esféricas puede resultar en errores. Si es posible, utilice índices 2dsphere para queries esféricas.
La siguiente tabla enumera los operadores del query geoespacial y el query admitido, utilizados por cada operación geoespacial:
Operación | Query esférica/plana | notas |
|---|---|---|
| Esférico | Véase también el operador |
| Plano | |
Esférico | Proporciona la misma funcionalidad que la operación Para queries esféricas, puede ser preferible usar | |
| Esférico | Utilice puntos GeoJSON en su lugar. |
| Esférico | |
| Plano | |
| Plano | |
| Plano | |
| Esférico | |
Esférico | ||
| Esférico | |
Plano |
Realice consultas geoespaciales en Atlas
Ejemplos
Cree una colección places con los siguientes documentos:
db.places.insertMany( [ { name: "Central Park", location: { type: "Point", coordinates: [ -73.97, 40.77 ] }, category: "Parks" }, { name: "Sara D. Roosevelt Park", location: { type: "Point", coordinates: [ -73.9928, 40.7193 ] }, category: "Parks" }, { name: "Polo Grounds", location: { type: "Point", coordinates: [ -73.9375, 40.8303 ] }, category: "Stadiums" } ] )
La siguiente operación crea un índice 2dsphere en el campo location:
db.places.createIndex( { location: "2dsphere" } )
La colección places mencionada anteriormente tiene un índice 2dsphere. La siguiente query utiliza el operador $near para devolver documentos que están al menos a 1000 metros y como máximo a 5000 metros del punto GeoJSON especificado, ordenados del más cercano al más lejano:
db.places.find( { location: { $near: { $geometry: { type: "Point", coordinates: [ -73.9667, 40.78 ] }, $minDistance: 1000, $maxDistance: 5000 } } } )
La siguiente operación utiliza la agregación $geoNear para devolver documentos que coinciden con el filtro de query { category:
"Parks" }, ordenados del más cercano al más lejano al punto GeoJSON especificado:
db.places.aggregate( [ { $geoNear: { near: { type: "Point", coordinates: [ -73.9667, 40.78 ] }, spherical: true, query: { category: "Parks" }, distanceField: "calcDistance" } } ] )