Docs Menu
Docs Home
/ /

Query geoespacial

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

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

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

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

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

  • Los valores de latitud válidos están entre -90 y 90, ambos inclusive.

Utilice matrices para pares de coordenadas heredados porque algunos idiomas no conservan el orden de los campos de objeto.

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.

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.

MongoDB proporciona los siguientes operadores del query geoespacial. Para más detalles, incluidos ejemplos, consulte las páginas de referencia respectivas.

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 en proximidad a un punto. Requiere un índice geoespacial. Los índices 2dsphere y 2d soportan $near.

Devuelve objetos geoespaciales en proximidad a un punto en una esfera. Requiere un índice geoespacial. Los índices 2dsphere y 2d soportan $nearSphere.

Nota

Las colecciones de series de tiempo solo admiten la etapa de agregación $geoNear para ordenar datos geoespaciales de consultas contra índices 2dsphere. No puede utilizar los operadores $near y $nearSphere en colecciones de series de tiempo

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 se 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 geo. Consulta Cómo crear un índice de 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

Versiones de índices de texto

En esta página