Ruby on rails Rails中带Mongoid的MongoDB-地理空间索引

Ruby on rails Rails中带Mongoid的MongoDB-地理空间索引,ruby-on-rails,ruby,mongodb,geolocation,mongoid,Ruby On Rails,Ruby,Mongodb,Geolocation,Mongoid,MongoDB有一个非常好的特性。如何在带有Mongoid的Rails中使用它?您可以在Mongoid中定义这样的地理索引 class Item include Mongoid::Document field :loc, :type => Array index( [ [:loc, Mongo::GEO2D] ], background: true ) end 以及查询 $near命令(不带max

MongoDB有一个非常好的特性。如何在带有Mongoid的Rails中使用它?

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

class Item
  include Mongoid::Document

  field :loc, :type => Array

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

  )
end
以及查询

$near命令(不带maxDistance)

$near命令(使用maxDistance)

使用公里时,将距离转换为111.12(一度约为111.12公里),或者将距离保留为启用“使用度”时的距离

$centerphere/$nearSphere查询

location = [80.24958300000003, 13.060422]
items = Item.where(:loc => {"$within" => {"$centerSphere" => [location, (distance.fdiv(6371) )]}})
这将找到10公里半径范围内的项目。在这里,我们需要转换距离/6371(地球半径),以使其与km一起工作

$box(边界框查询)


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

RameshVel的答案非常好

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

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

所有这些答案对于最新版本的MongoDB来说都是过时的,并且会抛出一些未初始化的常量Mongo::GEO2D


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

当我尝试使用$near命令(使用maxDistance)时,它返回一个错误:地理值必须是数字:{$maxDistance:0.001799856011519079,$near:[80.249,13.060422]}有什么想法吗?它只在“$near”的位置工作,但当我添加“$maxDistance”时,它会阻塞。@Vasily,我不确定。。带有$maxdistance的$near查询可以很好地处理您指定的值<代码>项目。其中(:loc=>{“$near”=>[80.249,13.060422],“$maxDistance'=>0.001799856011519079})。它很好用。。也许你能告诉我你想问的问题?我们将看到,当我使用maxDistance时,我有相同的错误。Ruby 1.8。你们找到解决方案了吗?事实上,这对我来说并不适用于
Mongoid 3.0.0
,文档显示了以下格式
索引({loc:“2d”},{min:-200,max:200})
。干杯
location = [80.24958300000003, 13.060422]
items = Item.where(:loc => {"$within" => {"$centerSphere" => [location, (distance.fdiv(6371) )]}})
 first_loc = [80.24958300000003, 13.060422]
 second_loc = [81.24958300000003, 12.060422]
 items = Item.where(:loc => {"$within" => {"$box" => [first_loc, second_loc]}})
index(
  { loc: Mongo::GEO2D },
  { background: true }
)