Usa consultas geoespaciales en operaciones compatibles con MongoDB para consultar documentos que existen dentro de un rango determinado a partir de una longitud y latitud específicas.
Antes de comenzar
Asegúrate de tener acceso a una base de datos existente compatible con las operaciones de MongoDB o crea una base de datos y conéctate a ella.
Asegúrate de tener al menos un índice 2dsphere o crea uno.
Objetos GeoJSON
Para ejecutar una consulta geoespacial en los campos de tu colección, los campos en los que realices la consulta deben ser objetos GeoJSON o GeoPoints.
Ejecuta una consulta geoespacial
Puedes realizar una búsqueda geoespacial con el operador $near, que calcula la distancia de un punto geográfico en relación con los puntos geográficos dentro de los documentos. Luego, estos documentos se ordenan de la distancia más cercana a la más lejana en los resultados de la búsqueda. También puedes anular este orden de clasificación definiendo una clasificación secundaria, que no sea $natural, en tu consulta. El operador $near debe existir en un campo del documento en el filtro de la búsqueda y debe contener un campo $geometry GeoJSON.
En el siguiente ejemplo, se usa el operador $near para calcular la distancia entre el punto geográfico (-122.084, 37.4221) y los puntos geográficos ubicados en el campo location de todos los documentos en myCollection.. Los documentos se muestran y se ordenan de la distancia más cercana a la más lejana entre los dos puntos.
db.myCollection.find({
location: {
$near: {
$geometry: {
type: 'Point',
coordinates: [ -122.084, 37.4221 ]
}
}
}
}
)
También puedes usar los campos opcionales $maxDistance y $minDistance para controlar la distancia en metros desde el punto de tu búsqueda.
En el siguiente ejemplo, se muestra una búsqueda en la que los documentos devueltos deben estar a una distancia de entre 500 y 2,000 metros del punto (-122.084, 37.4221):
db.myCollection.find({
location: {
$near: {
$geometry: {
type: 'Point',
coordinates: [ -122.084, 37.4221 ]
},
$maxDistance: 2000,
$minDistance: 500
}
}
}
Si tu índice está particionado, puedes filtrar según la partición incluyendo la partición en un filtro de igualdad "y" dentro de tu consulta.
Por ejemplo, si tuvieras una partición region y quisieras filtrar los resultados de la consulta por la región midwest, podrías hacer lo siguiente:
db.myCollection.find( { $and: [
{ location:
{ $near: {
$geometry: {
type: 'Point',
coordinates: [ -122.084, 37.4221 ]
},
}
},
{ "region": "midwest" }
] } )
El valor de tu partición debe ser una cadena. Tu filtro de partición debe unirse a tu búsqueda con un operador $and.
Limitaciones
- Los operadores
$neary$textno se pueden usar en la misma consulta. $nearno se puede anidar en una instrucción$orde varias cláusulas, a menos que$nearsea la única expresión en la cláusula$or.$nearno se puede usar con los operadores$noto$noren una consulta.$nearno se admite en las consultas de agregación.