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.
Temas
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
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
$geoNear
y $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.