2011-10-09 21 views

Trả lời

47

Bạn có thể xác định chỉ số đị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 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 mức độ là khoảng 111,12 km) khi sử dụng km, hoặc để lại khoảng cách vì nó là về việc sử dụng độ

$ centerSphere/$ nearSphere truy vấn

location = [80.24958300000003, 13.060422] 
items = Item.where(:loc => {"$within" => {"$centerSphere" => [location, (distance.fdiv(6371))]}}) 

này sẽ tìm thấy các vật phẩm trong bán kính 10 km. Ở đây chúng ta cần phải 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.

$ hộp (bounding truy vấn hộp)

first_loc = [80.24958300000003, 13.060422] 
second_loc = [81.24958300000003, 12.060422] 
items = Item.where(:loc => {"$within" => {"$box" => [first_loc, second_loc]}}) 

này sẽ giúp bạn để tìm các mục trong khung giới hạn nhất định.

+0

Khi tôi thử sử dụng $ gần lệnh (với maxDistance) nó sẽ trả về một lỗi: giá trị geo phải số: {$ maxDistance: ,001799856011519079, $ gần: [80,249, 13,060422]} Bất kỳ suy nghĩ? Nó hoạt động chỉ với "$ gần" tại chỗ, nhưng khi tôi thêm "$ maxDistance", nó sẽ chokes. – Vasily

+0

@ Rất tiếc, tôi không chắc chắn .. truy vấn $ gần với $ maxdistance hoạt động hoàn toàn tốt với các giá trị bạn chỉ định. 'Item.where (: loc => {" $ near "=> [80.249, 13.060422], '$ maxDistance' => 0.001799856011519079})'. nó hoạt động tốt .. Có thể bạn có thể chỉ cho tôi các truy vấn bạn đang cố gắng? chúng ta sẽ thấy sau đó – RameshVel

+0

Tôi đã có lỗi tương tự khi tôi sử dụng maxDistance. Ruby 1.8. Các bạn có tìm được giải pháp không? –

7

Câu trả lời của RameshVel thật tuyệt vời.

Như một bản cập nhật, trong Mongoid 3.0.4, tôi phải xác định các chỉ số như sau để làm cho nó làm việc với rake db:mongoid:create_indexes:

index(
    { loc: Mongo::GEO2D }, 
    { background: true } 
) 
+6

Thực ra điều này không hiệu quả đối với tôi với 'Mongoid 3.0.0', tài liệu chỉ ra định dạng sau' chỉ mục ({loc: "2d"}, {min: -200, max: 200}) '. Chúc mừng. – rjgonzo

0

Tất cả những câu trả lời là một lỗi thời với các phiên bản mới nhất của MongoDB và sẽ ném một số uninitialized constant Mongo::GEO2D

Đối với mongoid 4/5, tôi khuyên bạn nên xem mongoid-geospatial gem nếu bạn cần chơi với đối tượng 2D hoặc tọa độ.

Các vấn đề liên quan