在Rails中使用Mongoid的MongoDB - 地理空间索引

Cam*_*mel 15 ruby ruby-on-rails geolocation mongodb mongoid

MongoDB具有非常好的地理空间索引功能.我怎样才能在带有Mongoid的Rails中使用它?

Ram*_*Vel 49

您可以在mongoid中定义这样的地理索引

class Item
  include Mongoid::Document

  field :loc, :type => Array

  index(
      [
          [:loc, Mongo::GEO2D]             
      ], background: true

  )
end
Run Code Online (Sandbox Code Playgroud)

对于查询

$ near命令(不带maxDistance)

 location = [80.24958300000003, 13.060422]
 items = Item.where(:loc => {"$near" => location})
Run Code Online (Sandbox Code Playgroud)

$ near命令(使用maxDistance)

 distance = 10 #km
 location = [80.24958300000003, 13.060422]
 items = Item.where(:loc => {"$near" => location , '$maxDistance' => distance.fdiv(111.12)})
Run Code Online (Sandbox Code Playgroud)

使用km时,将距离转换为111.12(一度约为111.12公里),或者使用度数保持距离

$ centerSphere/$ nearSphere 查询

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

这将找到半径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]}})
Run Code Online (Sandbox Code Playgroud)

这将帮助您找到给定边界框内的项目.


Jak*_*ose 7

RameshVel的答案很棒.

作为更新,在Mongoid 3.0.4中,我必须按如下方式定义索引以使其适用于rake db:mongoid:create_indexes:

index(
  { loc: Mongo::GEO2D },
  { background: true }
)
Run Code Online (Sandbox Code Playgroud)

  • 实际上这对我来说不适用于`Mongoid 3.0.0`,文档指出以下格式`index({loc:"2d"},{min:-200,max:200})`.干杯. (7认同)