Используйте геопространственные запросы в операциях, совместимых с MongoDB, для поиска документов, существующих в определенном диапазоне от заданной долготы и широты.
Прежде чем начать
Убедитесь, что у вас есть доступ к существующей базе данных операций, совместимой с MongoDB, или создайте базу данных и подключитесь к ней .
Убедитесь, что у вас есть хотя бы один индекс 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не поддерживается в агрегационных запросах.