Эта глава представляет запросы MongoDB для геопространственных данных, которые поддерживают геометрические запросы на пересечение и содержание.

Сценарии применения:

  • Нарисуйте круг на карте и выполните запрос данных внутри круга.

Руководство по предварительным требованиям

Форматы хранения геопространственных данных для MongoDB

Для запроса данных на основе расстояния требуется следующее:

  • Каждый документ данных содержит поле для хранения координатных данных, например: поле location хранит координаты магазина.
  • Создайте 2dsphere или 2d пространственный индекс.

Оператор $geoWithin

Он обычно используется для запроса координатных точек, содержащихся в указанном геометрическом диапазоне, например: при поиске домов по рисунку на карте нарисуйте область на карте и запросите дома в этой области.

Синтаксический формат:

{
   <поле местоположения>: { // Поле запроса
      $geoWithin: {
         $geometry: {
            type: , // Поддерживает только Polygon или MultiPolygon.
            coordinates: [ <координаты> ]  // Коллекция геометрических координатных точек
         }
      }
   }
}

Пример:

db.places.find(
   {
     loc: { // Поле loc хранит координатные данные
       $geoWithin: {
          $geometry: {
             type: "Polygon" ,
             coordinates: [ [ [ 0, 0 ], [ 3, 6 ], [ 6, 1 ], [ 0, 0 ] ] ] // Найти данные внутри этой геометрической области
          }
       }
     }
   }
)

Запрос данных документа внутри указанной геометрической области в коллекции мест.

Оператор $geoIntersects

Отличие от $geoWithin заключается в том, что $geoIntersects используется для определения наличия пересечения между двумя геометриями.

Формат:

{
  <поле местоположения>: { // Поле для хранения геометрических координатных точек
     $geoIntersects: {
        $geometry: {
           type: "<тип объекта геоjson>" , // Геометрический тип
           coordinates: [ <координаты> ] // Коллекция геометрических координатных точек, запрос данных с пересечением с этой геометрией
        }
     }
  }
}

Пример:

db.places.find(
   {
     loc: { // Поле loc хранит данные области, которая является геометрической формой
       $geoIntersects: {
          $geometry: {
             type: "Polygon" ,
             coordinates: [
               [ [ 0, 0 ], [ 3, 6 ], [ 6, 1 ], [ 0, 0 ] ] // Запрос данных с пересечением с этой геометрией
             ]
          }
       }
     }
   }
)