Подтвердить что ты не робот

MongoDB с Mongoid in Rails - Геопространственное индексирование

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

4b9b3361

Ответ 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 }
)