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

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

您可以在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)}) 

使用km时,将距离转换为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]}}) 

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

RameshVel的答案很棒。

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

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

所有这些答案都是过时的最新版本的MongoDB,并会抛出一些uninitialized constant Mongo::GEO2D

对于mongoid 4/5,如果您需要使用2D对象或坐标,我建议您查看mongoid-geospatial gem 。