Consulta de datos geoespaciales con Amazon DocumentDB - Amazon DocumentDB

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

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 JSONespecificación geográfica para representar datos geoespaciales. Geo JSON es una especificación de código abierto para el JSON formato de formas en un espacio de coordenadas. JSONLas coordenadas geográficas 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 JSON tipo geográfico «Punto» para almacenar datos geoespaciales. Cada JSON documento geográfico (o subdocumento) 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 encontrar puntos del más cercano al más lejano de un punto geográfico. JSON

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

  • $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 geográfico específico. JSON

nota

$geoNeary $nearSphere requieren un índice de 2dsphere en el JSON campo geográfico 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, usa la opción limit onum.

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

$geoNearLa etapa admite las num opciones limit y para especificar el número máximo de documentos que se van a devolver. $geoNeardevuelve un máximo de 100 documentos por defecto si no se especifican num las opciones limit o. Esto se anula con el valor de la $limit etapa, 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 un $nearSphere mínimo $minDistance y un máximo $maxDistance desde un punto geográfico JSON

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 consultas ni indexación de polígonos,,, LineString y. MultiPoint MultiPolygon MultiLineString GeometryCollection