Skip to content

Latest commit

 

History

History
324 lines (245 loc) · 22.5 KB

consultas-geoespaciales.md

File metadata and controls

324 lines (245 loc) · 22.5 KB

Consultas Geoespaciales

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

Datos geoespaciales

En MongoDB, puede almacenar datos geoespaciales como objetos GeoJSON o como pares de coordenadas heredados .

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, use un documento incrustado con:

  • un campo llamado typeque especifica el tipo de objeto GeoJSON y

  • un campo llamado coordinatesque especifica las coordenadas del objeto.

    Si especifica las coordenadas de latitud y longitud, enumere primero la longitud y luego la latitud :

    • Los valores de longitud válidos están entre -180y 180, ambos inclusive.
    • Los valores de latitud válidos están entre -90y 90, ambos inclusive.
<field>: { type: <GeoJSON type> , coordinates: <coordinates> }

Por ejemplo, para especificar un punto GeoJSON :

location: {
      type: "Point",
      coordinates: [-73.856077, 40.848447]
}

Para obtener una lista de los objetos GeoJSON compatibles con MongoDB, así como ejemplos, consulte Objetos GeoJSON .

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.
Pares de coordenadas heredados

Para calcular distancias en un plano euclidiano, almacene sus datos de ubicación como pares de coordenadas heredados y use un 2díndice. MongoDB admite cálculos de superficies esféricas en pares de coordenadas heredados a través de un 2dsphereíndice al convertir los datos al tipo de punto GeoJSON.

Para especificar datos como pares de coordenadas heredados, puede usar una matriz ( preferido ) o un documento incrustado.Especificar mediante una matriz ( preferido ):

<field>: [ <x>, <y> ]

Si especifica coordenadas de latitud y longitud, indique primero la longitud y luego la latitud ; es decir

<field>: [<longitude>, <latitude> ]
  • Los valores de longitud válidos están entre -180y 180, ambos inclusive.
  • Los valores de latitud válidos están entre -90y 90, ambos inclusive.

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

Para especificar pares de coordenadas heredados, se prefieren las matrices sobre un documento incrustado, ya que algunos idiomas no garantizan el orden asociativo de mapas.

Índices geoespaciales

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

2dsphere

Los índices de 2dsphere admiten consultas que calculan geometrías en una esfera similar a la tierra .

Para crear un 2dsphereíndice, use el db.collection.createIndex()método y especifique el literal de cadena "2dsphere"como tipo de índice:

db.collection.createIndex( { <location field> : "2dsphere" } )

donde <location field>es un campo cuyo valor es un objeto GeoJSON o un par de coordenadas heredado .

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 $nearSphereconsultas que calculan en una esfera, si es posible, utilice el 2dsphereíndice para consultas esféricas.

Para crear un 2díndice, use el db.collection.createIndex() método, especificando el campo de ubicación como clave y el literal de cadena "2d"como tipo de índice:

db.collection.createIndex( { <location field> : "2d" } )

donde <location field>es un campo cuyo valor es un par de coordenadas heredado .

Para obtener más información sobre el 2díndice, consulte 2dÍndices .

Índices geoespaciales y colecciones fragmentadas

No puede utilizar un índice geoespacial como clave de fragmentación al fragmentar una colección. Sin embargo, puede crear un índice geoespacial en una colección fragmentada utilizando un campo diferente como clave de fragmentación.

Las siguientes operaciones geoespaciales se admiten en colecciones fragmentadas:

A partir de MongoDB 4.0, $neary $nearSpherelas consultas se admite para colecciones fragmentados.

En versiones anteriores de MongoDB, las consultas $neary las $nearSpherecolecciones fragmentadas no son compatibles; en su lugar, para los clústeres fragmentados, debe usar la $geoNearetapa de agregación o el geoNearcomando (disponible en MongoDB 4.0 y versiones anteriores).

También puede consultar datos geoespaciales para un clúster fragmentado mediante $geoWithiny $geoIntersects.

Consultas cubiertas

Los índices geoespaciales no pueden cubrir una consulta .

NOTA

Para consultas esféricas, use el 2dsphereresultado del índice.

El uso de 2díndice para consultas esféricas puede conducir a resultados incorrectos, como el uso del 2díndice para consultas esféricas que envuelven los polos.

Operadores de consultas geoespaciales

MongoDB proporciona los siguientes operadores de consultas geoespaciales:

Nombre Descripción
$geoIntersects Selecciona geometrías que se cruzan con una geometría GeoJSON . El índice 2dsphere admite archivos $geoIntersects.
$geoWithin Selecciona geometrías dentro de una geometría GeoJSON delimitante . Los índices 2dsphere y 2d son compatibles $geoWithin.
$near Devuelve objetos geoespaciales próximos a un punto. Requiere un índice geoespacial. Los índices 2dsphere y 2d son compatibles $near.
$nearSphere Devuelve objetos geoespaciales próximos a un punto de una esfera. Requiere un índice geoespacial. Los índices 2dsphere y 2d son compatibles $nearSphere.

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 canalización de agregación geoespacial :

Etapa Descripción
$geoNear

Devuelve un flujo ordenado de documentos según la proximidad a un punto geoespacial. Incorpora la funcionalidad de $match, $sort y $limitpara los datos geoespaciales. Los documentos de salida incluyen un campo de distancia adicional y pueden incluir un campo de identificación de ubicación.

$geoNearrequiere un índice geoespacial .

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

Modelos geoespaciales

Las consultas geoespaciales de MongoDB pueden interpretar la geometría en una superficie plana o una esfera.

2dsphere los índices solo admiten consultas esféricas (es decir, consultas que interpretan geometrías en una superficie esférica).

2dlos índices admiten consultas planas (es decir, consultas que interpretan geometrías en una superficie plana) y algunas consultas esféricas. Si bien los 2d índices admiten algunas consultas esféricas, el uso de 2díndices para estas consultas esféricas puede generar errores. Si es posible, utilice 2dsphereíndices para consultas esféricas.

La siguiente tabla enumera los operadores de consulta geoespacial, consulta admitida, utilizados por cada operación geoespacial:

Operación Consulta esférica / plana Notas
$near( Punto de centroide GeoJSON en esta línea y la línea siguiente, índice 2dsphere ) Esférico Consulte también el $nearSphereoperador, que proporciona la misma funcionalidad cuando se usa con GeoJSON y un índice 2dsphere .
$near( coordenadas heredadas, índice 2d ) Departamento
$nearSphere( Punto GeoJSON , índice 2dsphere ) Esférico

Proporciona la misma funcionalidad que la $nearoperación que usa un punto GeoJSON y un índice 2dsphere .

Para consultas esféricas, puede ser preferible utilizar $nearSphereque especifique explícitamente las consultas esféricas en el nombre en lugar del $nearoperador.

$nearSphere( coordenadas heredadas, índice 2d ) Esférico Utilice puntos GeoJSON en su lugar.
$geoWithin: { $geometry: ...} Esférico
$geoWithin: { $box: ...} Departamento
$geoWithin: { $polygon: ...} Departamento
$geoWithin: { $center: ...} Departamento
$geoWithin: { $centerSphere: ...} Esférico
$geoIntersects Esférico
$geoNearetapa de agregación ( índice 2dsphere ) Esférico
$geoNearetapa de agregación ( índice 2d ) Departamento

Ejemplo

Crea una colección placescon los siguientes documentos:

db.places.insert( {    name: "Central Park",   location: { type: "Point", coordinates: [ -73.97, 40.77 ] },   category: "Parks"} );db.places.insert( {   name: "Sara D. Roosevelt Park",   location: { type: "Point", coordinates: [ -73.9928, 40.7193 ] },   category: "Parks"} );db.places.insert( {   name: "Polo Grounds",   location: { type: "Point", coordinates: [ -73.9375, 40.8303 ] },   category: "Stadiums"} );

La siguiente operación crea un 2dsphereíndice en el locationcampo:

db.places.createIndex( { location: "2dsphere" } )

La siguiente consulta utiliza el $nearoperador para devolver documentos que están al menos a 1000 metros y como máximo a 5000 metros del punto GeoJSON especificado, ordenados en orden de más cercano a 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 $geoNearoperación de agregación para devolver documentos que coinciden con el filtro de consulta { category: "Parks" }, ordenados de más cerca a más lejos del punto GeoJSON especificado:

db.places.aggregate( [   {      $geoNear: {         near: { type: "Point", coordinates: [ -73.9667, 40.78 ] },         spherical: true,         query: { category: "Parks" },         distanceField: "calcDistance"      }   }] )