使用地理空间索引mongodb mongomapper查询源和目标

时间:2012-09-20 08:42:31

标签: mongodb ruby-on-rails-3.2 geospatial mongomapper

我在名为Flight mongodb 集合中有源和目标字段。这两个字段都是地理空间索引并以lat-long格式编写。我正在使用mongomapper从rails控制器中查询它。

我想写一个如下的查询。

Result= Flight.where(:source => {'$near' =>  location_src} , :destination => {'$near' => location_dest} )

其中location_src和location_dest是lat-long格式的gui输入。

但是,当我尝试通过撰写Result.firstResult.all来访问结果时,它就是这么说的 Mongo::OperationFailure: can't have 2 special fields

任何人都可以向我建议可能的解决方法吗?

亲切的问候, Amrish。

3 个答案:

答案 0 :(得分:1)

目前,Mongodb每个集合仅支持1个地理索引。记录来自this page

  

目前,每个集合可能只有1个地理空间索引。而   MongoDB可能允许创建多个索引,这种行为是   不支持的。因为MongoDB只能使用一个索引来支持   在大多数情况下,单个查询将产生多个地理索引   不良行为。

答案 1 :(得分:0)

@Amrish

目前mongodb每个集合只能有一个2d索引,但是你可以拥有多位置文档。

地址: [ {loc:[Lon,Lat],//或{lon:“somevalue”,lat:“somevalue”} 名称:“开始” },

{loc:[Lon,Lat],//或{lon:“somevalue”,lat:“somevalue”} 名称:“结束” }, ]

你可以在Address.loc上有2d索引

这可以帮助$ near和geoNear进行搜索,并且可以用于搜索解决方法查找给定lat-lng对附近的所有“开始”点

还要注意:它应该是(长,纬)对不反转。

答案 2 :(得分:0)

看起来SO有zig-zag的例子

很快,把(lng,lat)对,名称:start或name:end。 制作上面的一对数组 将2d Index放在上面的数组上。

这可以帮助您查询找到给定(lng,lat)对附近的所有起点。 这可以帮助您查询找到给定(lng,lat)对附近的所有终点。

你应该能够对上述两个操作使用AND / OR等操作