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