Overview
Puede consultar datos en función de la ubicación geográfica utilizando operadores del query geoespacial. Puedes formatear consultas geoespaciales usando uno de los siguientes sistemas de coordenadas:
Esta sección contiene ejemplos de consultas geoespaciales utilizando diferentes operadores del query que puedes ejecutar en tu conjunto de datos de muestra de Atlas.
Coordenadas en una esfera similar a la Tierra
Para queries geoespaciales que empleen coordenadas de longitud y latitud sobre una esfera parecida a la Tierra, use el formato de query GeoJSON. Aunque GeoJSON tiene múltiples tipos, todos los tipos de datos GeoJSON usan alguna forma de la siguiente estructura:
<field> : { type: <GeoJSON type>, coordinates: [ [longitude_1, latitude_1], ... [longitude_n, latitude_n] ] }
El tipo de objeto Realm determina el número de coordenadas. Por instancia, a
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 puedes expresar consultas geoespaciales usando x y y coordenadas en un plano euclidiano bidimensional. Hasta MongoDB, este era el único formato compatible con consultas geoespaciales, y ahora se denominan "legacy coordinate pairs".
Legacy coordinate pairs utilizan la siguiente estructura:
<field> : [ x, y ]
El campo contiene un arreglo de dos valores donde 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"});
Consulta la página del manual del Servidor de MongoDB sobre legacy coordinate pairs para más información.
Nota
Los índices esféricos (2dsphere) y planos (2d) admiten algunos, pero no todos, los mismos operadores del query. Para obtener una lista completa de los operadores y su compatibilidad con índices, consulte la entrada del manual para 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 en 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.
Query 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);
Para más información sobre los operadores que puedes usar en tu query, consulta la página de manual de operadores de query geoespacial de MongoDB Server.