Ответ создан с помощью официальных документов MongoDB, представленных на этой ссылке.
Ваш запрос на поиск местоположения в пределах 5 километров должен выглядеть следующим образом:
db.community.find({
geolocation: {
{ $geoWithin:
{ $centerSphere: [ [ uLongitude, uLatitude ], 5 / 6378.1 ] }
}
}
})
Объяснение:
$geoWithin
ищет местоположения в пределах региона, который указан его аргументом $centerSphere
используетсядля обозначения круговой области путем указания центра и радиана в радианах 5 / 6378.1
используется для преобразования 5 километров в радианы. См. эту страницу для получения дополнительной информации из официальных документов MongoDB
Документы также заявляют:
$ geoWithin не возвращает документы в каких-либо конкретныхпорядок, поэтому он может сначала показать пользователю самые дальние документы.
Чтобы найти документы отсортированным образом, используйте этот запрос, который составлен с использованием документов, представленных в в этом месте :
var METERS_PER_KM = 6378.1
db.community.find({
geolocation: {
$nearSphere: {
$geometry: {
type: "Point",
coordinates: [ -73.93414657, 40.82302903 ]
},
$maxDistance: 5 * METERS_PER_KM
}
}
});
Объяснение:
$nearSphere
возвращает документы в сфере radius (5 km
) из center (uLongitude
, uLatitude
) в отсортированном виде, ближайший к дальнему от центра.
Edit 1: Согласно обсуждению в комментарияхПроходя через документы MongoDB, вы также можете использовать такой запрос агрегации, чтобы получить расстояние:
db.places.aggregate( [
{
$geoNear: {
near: { type: "Point", coordinates: [ uLongitude, uLatitude ] },
spherical: true,
query: {
// Pass Any Other Query Conditions in this object
},
distanceField: "calcDistance"
}
}
] )
Объяснение: Вы можете передать любые другие условия запроса в query
param на стадии $geoNear
, и вы должны получить расстояние в поле calcDistance
в тон запрашивает результаты документов. Попробуйте выполнить примеры здесь .
Edit 2: Чтобы найти сообщество, сферический диапазон которого пересекается с координатами пользователя, местоположение сообщества должно быть сохранено как Polygon
к сожалению, это не так в вашем случае, иначе вы можете использовать простой запрос $geoIntersect
. Ссылка на пример