MongoDB có một tính năng rất đẹp Geospatial Indexing. Làm thế nào tôi có thể sử dụng nó trong Rails với Mongoid?MongoDB với Mongoid trong Rails - Chỉ mục không gian địa lý
Trả lời
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.
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 }
)
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
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 độ.
- 1. Chỉ mục không gian địa lý trong mongodb với node.js
- 2. MongoDB truy vấn không gian địa lý với $ không
- 3. bên trong cơ chế lập chỉ mục địa không gian trong mongodb
- 4. Lỗi MongoDB với Mongoid, Heroku, Thiết bị, MongoHQ và Rails
- 5. Mongodb, mongoid Rails 3.1. * Lỗi với bản ghi Hoạt động
- 6. Xem các chỉ mục hiện có trong MongoDB sử dụng mongoid
- 7. Bí danh trường với Mongoid và Rails
- 8. Chỉ số không gian cho các tọa độ địa lý?
- 9. Tại sao MongoDB có thể tạo chỉ mục duy nhất nhưng Mongoid không thể?
- 10. Có thể chỉ định truy vấn nào sẽ sử dụng chỉ mục trong Mongoid không?
- 11. Hiểu địa chỉ ảo và không gian địa chỉ ảo
- 12. Phân cụm không gian địa lý với elasticsearch
- 13. Chỉ số địa không gian hoạt động như thế nào?
- 14. Mã hóa địa lý địa chỉ với mã hóa địa lý và cơ sở dữ liệu PostGIS với RGeo
- 15. Tính khoảng cách không gian địa lý với radian
- 16. MongoDB: Kết hợp tìm kiếm văn bản và truy vấn không gian địa lý
- 17. Quản lý di chuyển mongoid
- 18. Rails 3.1 Mongoid has_secure_password
- 19. PAE (Mở rộng địa chỉ vật lý) cho phép không gian địa chỉ lớn hơn 4GB như thế nào?
- 20. Trình tải Bản đồ DLL trong Xử lý Không gian Địa chỉ
- 21. MongoDB - Truy vấn trên trường lồng nhau với chỉ mục
- 22. mục đẩy trong mảng mongoid
- 23. Hỗ trợ không gian địa lý trong JPA
- 24. I18n trong Rails 3 với không gian tên quản trị
- 25. Firebase có làm không gian địa lý không?
- 26. MongoDB sắp xếp hộp giới hạn địa lý
- 27. MongoDB giữ truy vấn không gian tên
- 28. chỉ số MongoDB với $ elemMatch
- 29. Tại sao MongoDB không sử dụng đúng chỉ mục?
- 30. có không gian địa chỉ MAC riêng không?
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
@ 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
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? –