MongoDB с Mongoid в Rails - геопространственная индексация - PullRequest
15 голосов
/ 09 октября 2011

MongoDB имеет очень хорошую функцию Геопространственное индексирование . Как я могу использовать его в Rails с Mongoid?

Ответы [ 3 ]

49 голосов
/ 09 октября 2011

Вы можете определить такие географические индексы в 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]}})

Это поможет вам найти предметы в заданной ограничительной рамке.

7 голосов
/ 28 августа 2012

RameshVel ответ велик.

В качестве обновления в Mongoid 3.0.4 мне пришлось определить индекс следующим образом, чтобы он работал с rake db:mongoid:create_indexes:

index(
  { loc: Mongo::GEO2D },
  { background: true }
)
1 голос
/ 09 марта 2016

Все эти ответы устарели с новейшими версиями MongoDB и будут выдавать uninitialized constant Mongo::GEO2D

Для mongoid 4/5, я предлагаю вам взглянуть на mongoid-геопространственный камень если вам нужно играть с 2D-объектами или координатами.

...