MongoDb геолокации - PullRequest
       2

MongoDb геолокации

0 голосов
/ 05 октября 2019

У меня есть коллекция под названием сообщество. Сообщество имеет геолокацию и радиус. Допустим, пользователи хотят присоединиться к сообществу, тогда я беру его геолокацию, если она доступна, или последнее сохраненное местоположение из БД. А затем проверьте, находится ли пользователь в радиусе сообщества, а затем разрешите ему присоединиться к сообществу. Только данные, которые у меня есть, это местоположение пользователей. Мне нужно найти список всех сообществ, в радиусе которых этот пользователь существует. enter image description here

1 Ответ

0 голосов
/ 05 октября 2019

Ответ создан с помощью официальных документов 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. Ссылка на пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...