Usar consultas geoespaciais

Use consultas geoespaciais em operações compatíveis com o MongoDB para consultar documentos que existem em um determinado intervalo de uma longitude e latitude específicas.

Antes de começar

  1. Verifique se você tem acesso a um banco de dados de operações compatíveis com o MongoDB ou crie um banco de dados e se conecte a ele.

  2. Verifique se você tem pelo menos um índice 2dsphere ou crie um.

Objetos GeoJSON

Para executar uma consulta geoespacial em campos da sua coleção, os campos consultados precisam ser objetos GeoJSON ou GeoPoints.

É possível realizar uma consulta geoespacial usando o operador $near, que calcula a distância de um ponto geográfico em relação a pontos geográficos dentro de documentos. Esses documentos são classificados da distância mais próxima para a mais distante nos resultados da consulta. Também é possível modificar essa ordem de classificação definindo uma classificação secundária, diferente de $natural, na consulta. O operador $near precisa existir em um campo de documento no filtro de consulta e conter um campo GeoJSON $geometry.

No exemplo a seguir, o operador $near é usado para calcular a distância entre o ponto geográfico (-122.084, 37.4221) e os pontos geográficos localizados no campo location de todos os documentos em myCollection.. Os documentos são retornados e ordenados pela distância mais próxima à mais distante entre os dois pontos.

  db.myCollection.find({
    location: {
      $near: {
        $geometry: {
          type: 'Point',
          coordinates: [ -122.084, 37.4221 ]
        }
      }
    }
  }
  )

Também é possível usar os campos opcionais $maxDistance e $minDistance para controlar a distância em metros do ponto da consulta. O exemplo a seguir mostra uma consulta em que os documentos retornados precisam estar a pelo menos 500 metros e no máximo 2.000 metros do ponto (-122.084, 37.4221):

  db.myCollection.find({
    location: {
      $near: {
        $geometry: {
          type: 'Point',
          coordinates: [ -122.084, 37.4221 ]
        },
        $maxDistance: 2000,
        $minDistance: 500
      }
    }
  }

Se o índice for particionado, será possível filtrar com base na partição incluindo-a em um filtro de igualdade "and" na consulta. Por exemplo, se você tiver uma partição region e quiser filtrar os resultados da consulta pela região midwest, faça o seguinte:

  db.myCollection.find( { $and: [
    { location:
      { $near: {
        $geometry: {
          type: 'Point',
          coordinates: [ -122.084, 37.4221 ]
        },
      }
    },
    { "region": "midwest" }
  ] } )

O valor da partição precisa ser uma string. O filtro de partição precisa ser unido à consulta de pesquisa por um operador $and.

Limitações

  • Os operadores $near e $text não podem ser usados na mesma consulta.
  • $near não pode ser aninhado em uma instrução $or de várias cláusulas, a menos que $near seja a única expressão na cláusula $or.
  • Não é possível usar $near com os operadores $not ou $nor em uma consulta.
  • $near não é compatível com consultas de agregação.