Overview
Puede consultar datos según la ubicación geográfica mediante operadores de consulta geoespacial. Puede formatear consultas geoespaciales utilizando uno de los siguientes sistemas de coordenadas:
Esta sección contiene ejemplos de consultas geoespaciales que utilizan diferentes operadores de consulta que puede ejecutar en su conjunto de datos de muestra de Atlas.
Coordenadas en una esfera similar a la Tierra
Para consultas geoespaciales que utilizan coordenadas de longitud y latitud en una esfera similar a la Tierra, utilice el formato de consulta GeoJSON. Si bien GeoJSON tiene varios tipos, todos los tipos de datos GeoJSON utilizan alguna forma de la siguiente estructura:
<field> : { type: <GeoJSON type>, coordinates: [ [longitude_1, latitude_1], ... [longitude_n, latitude_n] ] }
El tipo de objeto determina el número de coordenadas. Por ejemplo, un
Point Requiere solo una coordenada: longitud y latitud. Un Line usa dos coordenadas: longitud y latitud para cada extremo. Un Polygon consiste en una lista de coordenadas donde la primera y la última son iguales, cerrando así el polígono. Para obtener más información sobre las formas GeoJSON que puede usar en MongoDB, consulte la entrada del manual de GeoJSON.
Para habilitar las consultas de datos GeoJSON, debes añadir el campo a un índice 2dsphere. El siguiente snippet crea un índice en el campo location.geo en la colección theaters usando el método createIndex():
await db.theaters.createIndex({location.geo: "2dsphere"});
Coordenadas en un plano 2D
También se pueden expresar consultas geoespaciales utilizando las coordenadas x y y en un plano euclidiano bidimensional. Hasta MongoDB, este era el único formato compatible con consultas geoespaciales y ahora se denominan "pares de coordenadas heredados".
Los pares de coordenadas heredados utilizan la siguiente estructura:
<field> : [ x, y ]
El campo contiene una matriz de dos valores en la que el primero representa el valor del eje x y el segundo representa el valor del eje y.
Para habilitar la consulta usando pares de coordenadas heredados, crea un índice 2d en el campo de la colección. El siguiente snippet crea un índice en el campo coordinates en la colección shipwrecks usando el método createIndex():
await db.shipwrecks.createIndex({coordinates: "2d"});
Consulte la página del manual de MongoDB Server sobre pares de coordenadas heredados para obtener más información.
Nota
Los índices esféricos () y planos2dsphere2d () admiten algunos, pero no todos, los mismos operadores de consulta. Para obtener una lista completa de operadores y su compatibilidad con índices, consulte la entrada del manual sobre consultas geoespaciales.
Ejemplos
Los siguientes ejemplos utilizan el conjunto de datos de ejemplo de MongoDB Atlas. Puede aprender a configurar su propio clúster Atlas de nivel gratuito y a cargar el conjunto de datos de ejemplo en nuestro Guía de inicio.
Los ejemplos utilizan la colección theaters de la base de datos sample_mflix del conjunto de datos de muestra. La colección theaters contiene un índice 2dsphere en el campo location.geo.
Consulta por proximidad
El operador $near acepta un conjunto de coordenadas de longitud y latitud y devuelve los documentos ordenados del más cercano al más lejano. Para limitar los resultados a una distancia máxima en metros, utilice la $maxDistance opción. Para obtener una lista completa de opciones, consulte la documentación de referencia $near de. El siguiente ejemplo busca cines a 10,000 menos de metros [ -73.9667, 40.78 ] de.
// Find theaters within a certain proximity async function proximity(theaters) { // Define the query to find theaters near a specific location const query = { "location.geo": { $near: { $geometry: { type: "Point", coordinates: [-73.9667, 40.78] }, $maxDistance: 10000, }, }, }; // Find documents based on our query const cursor = theaters.find(query);
Consulta dentro de un rango
The $geoWithin operator selects documents with geospatial data that exist within a specified shape. The following example searches for movie theaters in the New England area:
// Find theaters within a specific geographic range async function range(theaters) { // Define the query to find theaters within a specified polygon const query = { "location.geo": { $geoWithin: { $geometry: { type: "Polygon", coordinates: [ [ [-72, 40], // Polygon coordinates defining the range [-74, 41], [-72, 39], [-72, 40], ], ], }, }, }, }; // Find documents based on our query const cursor = theaters.find(query);
Consulte la página del manual de MongoDB Server sobre operadores de consulta geoespacial para obtener más información sobre los operadores que puede utilizar en su consulta.