Cómo usar la búsqueda geoespacial

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

  1. 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.

  2. 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.

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 $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 se admite en las consultas de agregación.