Bạn có thể xác định các chỉ mục địa lý như thế này trong mongoid
class Item
include Mongoid::Document
field :loc, :type => Array
index(
[
[:loc, Mongo::GEO2D]
], background: true
)
end
Và đối với các truy vấn
$ gần lệnh (không có maxDistance)
location = [80.24958300000003, 13.060422]
items = Item.where(:loc => {"$near" => location})
$ gần lệnh (với maxDistance)
distance = 10 #km
location = [80.24958300000003, 13.060422]
items = Item.where(:loc => {"$near" => location , '$maxDistance' => distance.fdiv(111.12)})
Chuyển đổi khoảng cách bằng 111,12 (một độ là khoảng 111,12 km) khi sử dụng km hoặc giữ nguyên khoảng cách như khi sử dụng độ
$ centerSphere / $ nearSphere truy vấn
location = [80.24958300000003, 13.060422]
items = Item.where(:loc => {"$within" => {"$centerSphere" => [location, (distance.fdiv(6371) )]}})
Điều này sẽ tìm thấy các mục trong bán kính 10 km. Ở đây chúng ta cần chuyển đổi khoảng cách / 6371 (bán kính trái đất) để làm cho nó hoạt động với km.
$ box (truy vấn hộp giới hạn)
first_loc = [80.24958300000003, 13.060422]
second_loc = [81.24958300000003, 12.060422]
items = Item.where(:loc => {"$within" => {"$box" => [first_loc, second_loc]}})
Điều này sẽ giúp bạn tìm thấy các mục trong hộp giới hạn nhất định.