Consulta de datos geoespaciales con Amazon DocumentDB - Amazon DocumentDB

Consulta de datos geoespaciales con Amazon DocumentDB

En esta sección se explica cómo puede consultar datos geoespaciales con Amazon DocumentDB. Tras leer esta sección, podrá responder a cómo almacenar, consultar e indexar datos geoespaciales en Amazon DocumentDB.

Información general

Los casos de uso más comunes de la tecnología geoespacial incluyen el análisis de proximidad de sus datos. Por ejemplo, “buscar todos los aeropuertos en un radio de 50 millas de Seattle” o “encontrar los restaurantes más cercanos desde una ubicación determinada”. Amazon DocumentDB utiliza la especificación GeoJSON para representar datos geoespaciales. GeoJSON es una especificación de código abierto para el formato JSON de formas en un espacio de coordenadas. Las coordenadas GeoJSON capturan tanto la longitud como la latitud y representan las posiciones en una esfera similar a la Tierra.

Indexación y almacenamiento de datos geoespaciales

Amazon DocumentDB utiliza el tipo GeoJSON de tipo “Punto” para almacenar datos geoespaciales. Cada documento (o subdocumento) de GeoJSON se compone generalmente de dos campos:

  • tipo: la forma que se representa, que indica a Amazon DocumentDB cómo interpretar el campo “coordenadas”. En este momento, Amazon DocumentDB solo admite puntos

  • coordenadas: un par de latitud y longitud representado como un objeto en una matriz: [longitud, latitud]

Amazon DocumentDB también utiliza índices de 2dsphere para indexar datos geoespaciales. Amazon DocumentDB admite puntos de indexación. Amazon DocumentDB admite consultas de proximidad con la indexación de 2dsphere.

Consideremos un escenario en el que está creando una aplicación para un servicio de entrega de alimentos. Desea almacenar el par de latitudes y longitudes de varios restaurantes en Amazon DocumentDB. Para ello, primero le recomendamos que cree un índice en el campo geoespacial que contenga el par de latitud y longitud.

use restaurantsdb db.usarestaurants.createIndex({location:"2dsphere"})

La salida de este comando tendrá un aspecto similar al siguiente:

{ "createdCollectionAutomatically" : true, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }

Una vez que haya creado un índice, puede empezar a insertar datos en su colección de Amazon DocumentDB.

db.usarestaurants.insert({ "state":"Washington", "city":"Seattle", "name":"Thai Palace", "rating": 4.8, "location":{ "type":"Point", "coordinates":[ -122.3264, 47.6009 ] } }); db.usarestaurants.insert({ "state":"Washington", "city":"Seattle", "name":"Noodle House", "rating": 4.8, "location":{ "type":"Point", "coordinates":[ -122.3517, 47.6159 ] } }); db.usarestaurants.insert({ "state":"Washington", "city":"Seattle", "name":"Curry House", "rating": 4.8, "location":{ "type":"Point", "coordinates":[ -121.4517, 47.6229 ] } });

Consulta de datos geoespaciales

Amazon DocumentDB admite consultas de proximidad, inclusión e intersección de datos geoespaciales. Un buen ejemplo de consulta de proximidad es buscar todos los puntos (todos los aeropuertos) que están a menos de una distancia determinada y a más de una distancia de otro punto (ciudad). Un buen ejemplo de consulta de inclusión es buscar todos los puntos (todos los aeropuertos) que estén ubicados en un área o polígono específicos (estado de Nueva York). Un buen ejemplo de consulta de intersección es buscar un polígono (estado) que se interseque con un punto (ciudad). Puede utilizar los siguientes operadores geoespaciales para obtener información a partir de sus datos.

  • $nearSphere- $nearSphere es un operador de búsqueda que permite buscar puntos del más cercano al más lejano de un punto GeoJSON.

  • $geoNear- $geoNear es un operador de agregación que permite calcular la distancia en metros desde un punto GeoJSON.

  • $minDistance- $minDistance es un operador de búsqueda que se utiliza junto con $nearSphere o $geoNear para filtrar documentos que se encuentran al menos a la distancia mínima especificada desde el punto central.

  • $maxDistance- $maxDistance es un operador de búsqueda que se utiliza junto con $nearSphere o $geoNear para filtrar documentos que se encuentran como máximo a la distancia máxima especificada desde el punto central.

  • $geoWithin- $geoWithin es un operador de búsqueda que permite buscar documentos con datos geoespaciales que existan completamente dentro de una forma específica, como un polígono.

  • $geoIntersects- $geoIntersects es un operador de búsqueda que permite buscar documentos cuyos datos geoespaciales se crucen con un objeto GeoJSON específico.

nota

$geoNeary $nearSphere requieren un índice de 2dsphere en el campo GeoJSON que utilice en la consulta de proximidad.

Ejemplo 1

En este ejemplo, aprenderá a buscar todos los restaurantes (puntos) ordenados por la distancia más cercana a una dirección (punto).

Para realizar una consulta de este tipo, puede $geoNear utilizar el cálculo de la distancia entre un conjunto de puntos y otro punto. También puede agregar el distanceMultiplier para medir la distancia en kilómetros.

db.usarestaurants.aggregate([ { "$geoNear":{ "near":{ "type":"Point", "coordinates":[ -122.3516, 47.6156 ] }, "spherical":true, "distanceField":"DistanceKilometers", "distanceMultiplier":0.001 } } ])

El comando anterior devolvería los restaurantes ordenados por distancia (del más cercano al más lejano) desde el punto especificado. La salida de este comando tendrá un aspecto similar al siguiente.

{ "_id" : ObjectId("611f3da985009a81ad38e74b"), "state" : "Washington", "city" : "Seattle", "name" : "Noodle House", "rating" : 4.8, "location" : { "type" : "Point", "coordinates" : [ -122.3517, 47.6159 ] }, "DistanceKilometers" : 0.03422834547294996 } { "_id" : ObjectId("611f3da185009a81ad38e74a"), "state" : "Washington", "city" : "Seattle", "name" : "Thai Palace", "rating" : 4.8, "location" : { "type" : "Point", "coordinates" : [ -122.3264, 47.6009 ] }, "DistanceKilometers" : 2.5009390081704277 } { "_id" : ObjectId("611f3dae85009a81ad38e74c"), "state" : "Washington", "city" : "Seattle", "name" : "Curry House", "rating" : 4.8, "location" : { "type" : "Point", "coordinates" : [ -121.4517, 47.6229 ] }, "DistanceKilometers" : 67.52845344856914 }

Para limitar el número de resultados de una consulta, utilice la opción limit o num.

limit:

db.usarestaurants.aggregate([ { "$geoNear":{ "near":{ "type":"Point", "coordinates":[ -122.3516, 47.6156 ] }, "spherical":true, "distanceField":"DistanceKilometers", "distanceMultiplier":0.001, "limit": 10 } } ])

num:

db.usarestaurants.aggregate([ { "$geoNear":{ "near":{ "type":"Point", "coordinates":[ -122.3516, 47.6156 ] }, "spherical":true, "distanceField":"DistanceKilometers", "distanceMultiplier":0.001, "num": 10 } } ])
nota

La etapa $geoNear admite las opciones limit y num para especificar el número máximo de documentos que se van a devolver. $geoNear devuelve un máximo de 100 documentos de forma predeterminada si no se especifican las opciones limit o num. Esto se anula con el valor de la etapa $limit, si está presente, y el valor es inferior a 100.

Ejemplo 2

En este ejemplo, aprenderá a buscar todos los restaurantes (puntos) en un radio de 2 kilómetros de una dirección (punto) específica. Para realizar una consulta de este tipo, puede utilizar $nearSphere con un $minDistance mínimo y un $maxDistance máximo desde un punto GeoJSON

db.usarestaurants.find({ "location":{ "$nearSphere":{ "$geometry":{ "type":"Point", "coordinates":[ -122.3516, 47.6156 ] }, "$minDistance":1, "$maxDistance":2000 } } }, { "name":1 })

El comando anterior devolvería los restaurantes a una distancia máxima de 2 kilómetros del punto especificado. La salida de este comando tendrá un aspecto similar al siguiente.

{ "_id" : ObjectId("611f3da985009a81ad38e74b"), "name" : "Noodle House" }

Limitaciones

Amazon DocumentDB no admite la consulta ni la indexación de Polygons, LineString, MultiPoint, MultiPolygon, MultiLineString y GeometryCollection.