Este capítulo introduce la consulta geoespacial de MongoDB, que admite consultas de intersección y contención geométrica.

Escenarios de aplicación:

  • Dibujar un círculo en el mapa y consultar los datos dentro del círculo.

Tutorial Prerrequisito

Formatos de almacenamiento de datos geoespaciales para MongoDB

Los requisitos previos para consultar datos basados en la distancia son los siguientes:

  • Cada documento de datos contiene un campo para almacenar datos de coordenadas, por ejemplo: el campo de ubicación almacena las coordenadas de una tienda.
  • Crear un índice espacial 2dsphere o 2d.

Operador $geoWithin

Comúnmente se utiliza para consultar puntos de coordenadas contenidos dentro de un rango geométrico especificado, por ejemplo: al buscar casas dibujando en un mapa, dibuje un área en el mapa y consulte las casas dentro de esa área.

Formato de sintaxis:

{
   <campo de ubicación>: { // Campo de consulta
      $geoWithin: {
         $geometry: {
            type: , // Solo admite Polígono o MultiPolígono.
            coordinates: [ <coordenadas> ]  // Colección de puntos de coordenadas geométricas
         }
      }
   }
}

Ejemplo:

db.places.find(
   {
     loc: { // El campo loc almacena los datos de coordenadas
       $geoWithin: {
          $geometry: {
             type: "Polígono" ,
             coordinates: [ [ [ 0, 0 ], [ 3, 6 ], [ 6, 1 ], [ 0, 0 ] ] ] // Encontrar datos dentro de esta área geométrica
          }
       }
     }
   }
)

Consulta los datos de documentos dentro del área geométrica especificada en la colección de lugares.

Operador $geoIntersects

La diferencia con $geoWithin es que $geoIntersects se utiliza para determinar si hay una intersección entre dos geometrías.

Formato:

{
  <campo de ubicación>: { // Campo que almacena puntos de coordenadas geométricas
     $geoIntersects: {
        $geometry: {
           type: "<tipo de objeto geojson>" , // Tipo geométrico
           coordinates: [ <coordenadas> ] // Colección de puntos de coordenadas geométricas, consulta datos con intersección con esta geometría
        }
     }
  }
}

Ejemplo:

db.places.find(
   {
     loc: { // El campo loc almacena datos de área, que es una forma geométrica
       $geoIntersects: {
          $geometry: {
             type: "Polígono" ,
             coordinates: [
               [ [ 0, 0 ], [ 3, 6 ], [ 6, 1 ], [ 0, 0 ] ] // Consulta datos con intersección con esta geometría
             ]
          }
       }
     }
   }
)