MongoDB admite operaciones de query sobre datos geoespaciales. Esta sección presenta las características geoespaciales de MongoDB.
Datos geoespaciales
En MongoDB puedes almacenar datos geoespaciales como objetos GeoJSON o como legacy coordinate pairs.
Objetos GeoJSON
Para calcular la 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
Utilice pares de coordenadas heredados para cálculos planos (euclidianos) con un índice 2d Indexes. Para realizar cálculos esféricos, convierta los pares heredados a un GeoJSON Point y utilice un índice 2dsphere Indexes.
Para especificar datos como legacy coordinate pairs, puede usar un arreglo (preferido) o un documento incrustado.
- Formación:
<field>: [ <x>, <y> ] Cuando utilice longitud y latitud, indique primero la longitud y luego la latitud:
<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.
- Documento incrustado:
<field>: { <field1>: <x>, <field2>: <y> } Si utiliza longitud y latitud, el primer campo debe ser longitud y el segundo debe ser latitud:
<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.
Utilice matrices para pares de coordenadas heredados porque algunos idiomas no conservan el orden de los campos de objeto.
Índices geoespaciales
Los índices geoespaciales admiten consultas sobre datos almacenados como Objetos GeoJSON o pares de coordenadas heredados. Puede usar índices geoespaciales para mejorar el rendimiento de las consultas sobre datos geoespaciales o para ejecutar ciertas consultas geoespaciales.
MongoDB proporciona dos tipos de índices geoespaciales:
2Índices dsphere, que admiten consultas que interpretan la geometría de una esfera.
2Índices d, que admiten consultas que interpretan la geometría en una superficie plana.
Para obtener más información sobre los índices geoespaciales, consulta Índices geoespaciales.
Query geoespacial
Nota
Utilizar un índice 2d para queries sobre datos esféricos puede devolver resultados incorrectos o un error. Por ejemplo, los índices 2d no admiten "queries" 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 en proximidad a un punto. Requiere un índice geoespacial. Los índices | |
Devuelve objetos geoespaciales en proximidad a un punto en una esfera. Requiere un índice geoespacial. Los índices |
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" } } ] )