MongoDB имеет очень приятную функцию геопространственного индексирования. Как я могу использовать его в Rails с Mongoid?
MongoDB с Mongoid in Rails - Геопространственное индексирование
Ответ 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 километров) при использовании километра или оставить расстояние, поскольку оно находится при использовании степени
$centerSphere/$nearSphere запросы
location = [80.24958300000003, 13.060422]
items = Item.where(:loc => {"$within" => {"$centerSphere" => [location, (distance.fdiv(6371) )]}})
Это найдет предметы в радиусе 10 км. Здесь нам нужно преобразовать расстояние /6371 (радиус Земли), чтобы заставить его работать с км.
$box (запросы с ограничивающей строкой)
first_loc = [80.24958300000003, 13.060422]
second_loc = [81.24958300000003, 12.060422]
items = Item.where(:loc => {"$within" => {"$box" => [first_loc, second_loc]}})
Это поможет вам найти элементы в данной ограничивающей рамке.
Ответ 2
Ответ на RameshVel велик.
Как обновление, в Mongoid 3.0.4, мне пришлось определить индекс следующим образом, чтобы он работал с rake db:mongoid:create_indexes
:
index(
{ loc: Mongo::GEO2D },
{ background: true }
)
Ответ 3
Все эти ответы устарели с новейшими версиями MongoDB и будут бросать некоторые uninitialized constant Mongo::GEO2D
Для mongoid 4/5 я предлагаю вам взглянуть на nofollow → , если вам нужно играть с 2D-объектами или координатами.