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

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

Прежде чем начать

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

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

Объекты GeoJSON

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

Вы можете выполнить геопространственный запрос, используя оператор $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 не поддерживается в агрегационных запросах.