#ruby-on-rails #ruby #mongodb #geolocation #mongoid
#ruby-on-rails #ruby #mongodb #геолокация #mongoid
Вопрос:
В MongoDB есть очень хорошая функция геопространственной индексации. Как я могу использовать его в Rails с Mongoid?
Ответ №1:
Вы можете определить географические индексы, подобные этому, в mongoid
class Item
include Mongoid::Document
field :loc, :type => Array
index(
[
[:loc, Mongo::GEO2D]
], background: true
)
end
И для запросов
команда $near (без maxDistance)
location = [80.24958300000003, 13.060422]
items = Item.where(:loc => {"$near" => location})
команда $near (с maxDistance)
distance = 10 #km
location = [80.24958300000003, 13.060422]
items = Item.where(:loc => {"$near" => location , '$maxDistance' => distance.fdiv(111.12)})
Преобразуйте расстояние в 111,12 (один градус равен приблизительно 111,12 км) при использовании km или оставьте расстояние таким, какое оно есть при использовании degree
Запросы $ centerSphere / $ nearSphere
location = [80.24958300000003, 13.060422]
items = Item.where(:loc => {"$within" => {"$centerSphere" => [location, (distance.fdiv(6371) )]}})
Это позволит найти элементы в радиусе 10 км. Здесь нам нужно преобразовать расстояние / 6371 (радиус Земли), чтобы заставить его работать с km.
$ box (запросы с ограничением)
first_loc = [80.24958300000003, 13.060422]
second_loc = [81.24958300000003, 12.060422]
items = Item.where(:loc => {"$within" => {"$box" => [first_loc, second_loc]}})
Это поможет вам найти элементы в пределах заданной ограничивающей рамки.
Комментарии:
1. Когда я пытаюсь использовать команду $near (с maxDistance), она возвращает ошибку: значения geo должны быть числами: { $maxDistance: 0.001799856011519079, $near: [ 80.249, 13.060422 ] } Есть мысли? Он работает только с «$ near» на месте, но когда я добавляю «$ maxDistance», он захлебывается.
2. @Василий, я не уверен.. запрос $near с $maxdistance отлично работает с указанными вами значениями.
Item.where(:loc => {"$near" => [ 80.249, 13.060422 ] , '$maxDistance' => 0.001799856011519079})
. это работает нормально.. Может быть, вы можете показать мне запрос, который вы пытались? тогда посмотрим3. У меня такая же ошибка, когда я использую maxDistance. Ruby 1.8. Вы, ребята, нашли решение?
Ответ №2:
Ответ РамешвЕла отличный.
В качестве обновления в Mongoid 3.0.4 мне пришлось определить индекс следующим образом, чтобы он работал с rake db:mongoid:create_indexes
:
index(
{ loc: Mongo::GEO2D },
{ background: true }
)
Комментарии:
1. На самом деле это не сработало для меня
Mongoid 3.0.0
, в документации указан следующий форматindex({ loc: "2d" }, { min: -200, max: 200 })
. Приветствия.
Ответ №3:
Все эти ответы устарели с новейшими версиями MongoDB и приведут к некоторым uninitialized constant Mongo::GEO2D
Для mongoid 4/5 я предлагаю вам взглянуть на mongoid-geospatial gem, если вам нужно поиграть с 2D-объектами или координатами.