Usa consultas geográficas

Usa consultas geoespaciales en operaciones compatibles con MongoDB para consultar documentos que existen dentro de un rango determinado desde una longitud y latitud específicas.

Antes de comenzar

  1. Asegúrate de tener acceso a una base de datos de operaciones compatibles con MongoDB existente o crea una base de datos y conéctate a ella.

  2. Asegúrate de tener al menos un índice 2dsphere o crea un índice 2dsphere.

Objetos GeoJSON

Para ejecutar una consulta geoespacial en los campos de tu colección, los campos que consultas deben ser objetos GeoJSON o GeoPoints.

Puedes realizar una consulta 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 consulta. También puedes anular este ordenamiento si defines un ordenamiento secundario, que no sea $natural, en tu consulta. El operador $near debe existir en un campo de documento en el filtro de consulta 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 de myCollection. Los documentos se muestran y ordenan por 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 consulta. En el siguiente ejemplo, se muestra una consulta en la que los documentos que se muestran deben estar a una distancia de al menos 500 metros y como máximo 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 si la incluyes en un filtro de igualdad "and" 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 consulta de búsqueda con un operador $and.

Limitaciones

  • Los operadores $near y $text no se pueden usar en la misma consulta.
  • $near no se puede anidar en una instrucción $or de varias cláusulas, a menos que $near sea la única expresión en la cláusula $or.
  • $near no se puede usar con los operadores $not o $nor en una consulta.
  • $near no es compatible con las consultas de agregación.