Este capítulo apresenta a consulta geoespacial do MongoDB, que suporta consultas de interseção e contenção geométrica.

Cenários de aplicação:

  • Desenhar um círculo no mapa e consultar os dados dentro do círculo.

Tutorial Pré-Requisito

Formatos de Armazenamento de Dados Geoespaciais para MongoDB

Os pré-requisitos para consultar dados com base na distância são os seguintes:

  • Cada dado do documento contém um campo para armazenar dados de coordenadas, por exemplo: o campo de localização armazena as coordenadas de uma loja.
  • Criar um índice espacial 2dsphere ou 2d.

Operador $geoWithin

É comumente usado para consultar pontos de coordenadas contidos dentro de um intervalo geométrico especificado, por exemplo: ao procurar casas desenhando em um mapa, desenhe uma área no mapa e consulte as casas dentro dessa área.

Formato da sintaxe:

{
   <campo de localização>: { // Campo de consulta
      $geoWithin: {
         $geometry: {
            type: , // Suporta apenas Polígono ou MultiPolígono
            coordinates: [ <coordenadas> ]  // Coleção de pontos de coordenadas geométricas
         }
      }
   }
}

Exemplo:

db.lugares.find(
   {
     loc: { // O campo loc armazena os dados de coordenadas
       $geoWithin: {
          $geometry: {
             type: "Polígono" ,
             coordinates: [ [ [ 0, 0 ], [ 3, 6 ], [ 6, 1 ], [ 0, 0 ] ] ] // Encontrar dados dentro desta área geométrica
          }
       }
     }
   }
)

Consulta de dados do documento dentro da área geométrica especificada na coleção de lugares.

Operador $geoIntersects

A diferença do $geoWithin é que $geoIntersects é usado para determinar se há uma interseção entre duas geometrias.

Formato:

{
  <campo de localização>: { // Campo que armazena pontos de coordenadas geométricas
     $geoIntersects: {
        $geometry: {
           type: "<tipo de objeto geojson>" , // Tipo geométrico
           coordinates: [ <coordenadas> ] // Coleção de pontos de coordenadas geométricas, consulta dados com interseção com esta geometria
        }
     }
  }
}

Exemplo:

db.lugares.find(
   {
     loc: { // O campo loc armazena dados de área, que é uma forma geométrica
       $geoIntersects: {
          $geometry: {
             type: "Polígono" ,
             coordinates: [
               [ [ 0, 0 ], [ 3, 6 ], [ 6, 1 ], [ 0, 0 ] ] // Consultar dados com interseção com esta geometria
             ]
          }
       }
     }
   }
)