Как использовать геопространственные запросы

Используйте геопространственные запросы в операциях, совместимых с MongoDB, чтобы запрашивать документы, которые находятся в определенном диапазоне от определенной долготы и широты.

Подготовка

  1. Убедитесь, что у вас есть доступ к существующей базе данных операций, совместимой с MongoDB, или создайте базу данных и подключитесь к ней.

  2. Убедитесь, что у вас есть хотя бы один индекс 2dsphere, или создайте его.

Объекты GeoJSON

Чтобы выполнить геопространственный запрос к полям в коллекции, поля, к которым вы запрашиваете, должны быть объектами GeoJSON или GeoPoints.

Вы можете выполнить геопространственный запрос с помощью оператора $near, который вычисляет расстояние от одной географической точки до других, указанных в документах. Затем эти документы сортируются в результатах запроса от ближайшего к самому дальнему. Вы можете переопределить этот порядок сортировки, задав в запросе вторичную сортировку, отличную от $natural. Оператор $near должен находиться в поле документа в фильтре запроса и содержать поле GeoJSON $geometry.

В примере ниже оператор $near используется для расчета расстояния между географической точкой (-122.084, 37.4221) и географическими точками, указанными в поле location всех документов в myCollection.. Документы возвращаются и упорядочиваются по расстоянию между двумя точками (от ближайшего к самому дальнему).

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

Вы также можете использовать необязательные поля $maxDistance и $minDistance, чтобы задать расстояние в метрах от точки запроса. В следующем примере показан запрос, в котором возвращаемые документы должны находиться на расстоянии не менее 500 метров и не более 2000 метров от точки (-122.084, 37.4221):

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

Если индекс секционирован, вы можете отфильтровать его по секции, включив секцию в фильтр равенства "и" в запросе. Например, если у вас есть раздел region и вы хотите отфильтровать результаты запроса по региону midwest, вы можете сделать следующее:

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

Значение раздела должно быть строкой. Фильтр разбиения должен быть соединен с поисковым запросом оператором $and.

Ограничения

  • Операторы $near и $text нельзя использовать в одном запросе.
  • Функцию $near нельзя вкладывать в оператор $or с несколькими условиями, если только $near не является единственным выражением в условии $or.
  • Оператор $near нельзя использовать в запросе вместе с операторами $not и $nor.
  • $near не поддерживается в запросах агрегирования.