Можете да дефинирате географски индекси като този в 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 (радиус на Земята), за да го накараме да работи с km.
$box (заявки с ограничаващи кутии)
first_loc = [80.24958300000003, 13.060422]
second_loc = [81.24958300000003, 12.060422]
items = Item.where(:loc => {"$within" => {"$box" => [first_loc, second_loc]}})
Това ще ви помогне да намерите елементите в рамките на даденото ограничаващо поле.