Docs Menu
Docs Home
/
Manual de base de datos
/

Query geoespacial

MongoDB admite operaciones de query sobre datos geoespaciales. Esta sección presenta las características geoespaciales de MongoDB.

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.

En MongoDB puedes almacenar datos geoespaciales como objetos GeoJSON o como legacy coordinate pairs.

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 type que especifica el tipo de objeto GeoJSON, y

  • un campo llamado coordinates que 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 -180 y 180, ambos inclusive.

  • Los valores de latitud válidos están entre -90 y 90, 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.

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 -180 y 180, ambos inclusive.

  • Los valores de latitud válidos están entre -90 y 90, 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 -180 y 180, ambos inclusive.

  • Los valores de latitud válidos están entre -90 y 90, 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.

MongoDB proporciona los siguientes tipos de índices geoespaciales para admitir las consultas geoespaciales.

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.

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.

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:

También puede consultar datos geoespaciales para un clúster fragmentado utilizando $geoWithin $geoIntersectsy.

Los índices geoespaciales no pueden cubrir una consulta.

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.

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 $geoIntersects.

Selecciona geometrías dentro de una geometría GeoJSON delimitadora. Los índices 2dsphere y 2d son compatibles con $geoWithin.

Devuelve objetos geoespaciales cercanos a un punto. Requiere un índice geoespacial. Los índices 2dsphere y 2d $near admiten.

Devuelve objetos geoespaciales cercanos a un punto de una esfera. Requiere un índice geoespacial. Los índices 2dsphere y 2d $nearSphere admiten.

Para obtener más detalles, incluidos ejemplos, consulte la página de referencia individual.

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 $match, $sort y $limit para datos geoespaciales. Los documentos de salida incluyen un campo adicional de distancia y pueden incluir un campo de identificador de ubicación.

$geoNear requiere un índice geoespacial.

Para más detalles, incluidos ejemplos, consulta la página de referencia $geoNear.

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

$near (punto centroide GeoJSON en esta línea y la línea siguiente, 2índice dsphere)

Esférico

Véase también el operador $nearSphere, que ofrece la misma funcionalidad cuando se usa con GeoJSON y un índice 2dsphere.

Plano

Esférico

Proporciona la misma funcionalidad que la operación $near que utiliza un punto GeoJSON y un índice 2dsphere.

Para queries esféricas, puede ser preferible usar $nearSphere que especifica explícitamente las queries esféricas en el nombre en lugar del operador $near.

Esférico

Utilice puntos GeoJSON en su lugar.

Esférico

$geoWithin : { $box: ... }

Plano

$geoWithin : { $polygon: ... }

Plano

$geoWithin : { $center: ... }

Plano

Esférico

Esférico

$geoNear etapa de agregación (2índice dsphere)

Esférico

Plano

Puedes usar la interfaz de usuario de MongoDB Atlas para realizar queries geoespaciales en Atlas.

1

Si su colección geoespacial aún no tiene un índice geoespacial, debe crear uno.

  1. Selecciona la base de datos para la colección.

    El panel principal y Namespaces en el lado izquierdo enumeran las colecciones de la base de datos.

  2. Seleccione la colección.

    Selecciona la colección que contenga tus datos geoespaciales en el lado izquierdo o en el panel principal. El panel principal muestra las vistas Find, Indexes y Aggregation.

  3. Seleccione la vista de índice.

    Cuando abres la vista Index, Atlas muestra cualquier índice que exista en la colección.

  4. Defina el índice para el tipo geo

    Presiona el botón Create Index.

    Define un índice de tipo geográfico. Consulta Cómo indexar objetos GeoJSON.

2
  1. Seleccione la vista de búsqueda.

    Desde la colección que contiene sus datos geoespaciales, seleccione la pestaña Find para ver su colección geoespacial.

  2. Introduce una query.

    Introduzca una query en el cuadro de texto Filter. Utiliza cualquiera de los operadores del query geoespacial para realizar el query relevante en tus datos geoespaciales. Una query geoespacial podría parecerse a:

    {
    "coordinates": {
    $geoWithin: {
    $geometry: {
    type: "Polygon",
    coordinates: [
    [
    [-80.0, 10.00], [ -80.0, 9.00], [ -79.0, 9.0], [ -79.0, 10.00 ], [ -80.0, 10.0 ]
    ]
    ]
    }
    }
    }
    }
  3. Presiona el botón 'Aplicar'.

    Se debe presionar el botón Apply para aplicar la query. Atlas filtra los datos geoespaciales para mostrar solo los documentos que coinciden con la query geoespacial.

Puedes crear y ejecutar pipeline de agregación para realizar queries geoespaciales en la interfaz de usuario de MongoDB Atlas.

1
  1. Selecciona la base de datos para la colección.

    El panel principal y Namespaces en el lado izquierdo enumeran las colecciones de la base de datos.

  2. Seleccione la colección.

    Selecciona la colección que contenga tus datos geoespaciales en el lado izquierdo o en el panel principal. El panel principal muestra las vistas Find, Indexes y Aggregation.

  3. Selecciona la vista de agregación.

    Cuando abres por primera vez la vista Aggregation, Atlas muestra una canalización de agregación vacía.

2
  1. Selecciona una etapa de agregación.

    Seleccione una etapa de agregación del menú desplegable Select en el panel inferior izquierdo.

    El interruptor a la derecha del menú desplegable determina si la etapa está habilitada.

    Se debe usar la etapa $geoNear para realizar queries geoespaciales en el pipeline de agregación.

  2. Se debe completar la etapa de agregación.

    Completa tu etapa con los valores adecuados. Si el Modo de comentario está habilitado, el generador de pipeline proporciona pautas sintácticas para la etapa seleccionada.

    A medida que se modifica la etapa, Atlas actualiza los documentos de vista previa a la derecha en función de los resultados de la etapa actual.

    La etapa $geoNear puede parecerse:

    {
    near: { type: "Point", coordinates: [ -73.9667, 40.78 ] },
    spherical: true,
    query: { category: "Parks" },
    distanceField: "calcDistance"
    }
  3. Ejecuta otras etapas del pipeline según sea necesario.

    Se deben agregar etapas según sea necesario para completar el pipeline de agregación. Se podrían añadir $out o $merge para guardar los resultados en una vista o en la colección actual.

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"
}
}
] )

Volver

Búsqueda de texto

En esta página