2012-09-20 63 views
2

我有我的mongodb集合名称Flight源和目标字段。这两个字段都以地理空间索引并以纬度长的格式书写。我正在使用mongomapper从rails控制器中查询它。查询源和目的地与地理空间索引mongodb mongomapper

我想编写一个如下所示的查询。

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。

回答

2

我发现了一个简单的解决方法,它可以满足我的目的,并且可能对面临类似情况的人有帮助。

虽然MongoDB中不支持在多个领域的地理空间查询同时,它还支持同时在多个领域的地理空间索引。所以,我们会按照如下方式一个接一个地在两个字段上运行查询。

  • start_place:出发地点的名称
  • start_place_loc:起始位置的坐标(索引地理空间领域)
  • end_place:目的地的名称
  • end_place_loc:目标位置的坐标(索引地理空间领域)

以下是示例代码。

tmp=Flight.distinct(:start_place,:start_place_loc => {'$near' => location_src}) 

Result=Flight.where(:start_place_loc => {'$near' => location_src} , :start_place => {'$in' => tmp}) 

此外,还需要根据需要设置'$ maxDistance'=>“value”。

1

目前Mongodb只支持每个集合1个地理索引。这是记录,从this page

您现在可能每个集合只有1个地理空间索引。虽然 MongoDB可能允许创建多个索引,但此行为不支持 。因为MongoDB中只能使用一个索引来支持 单查询,在大多数情况下,有多个地理索引将产生 不良行为。

+0

是的,我读了它。因此,我正在寻找解决方法。我相信,很多人一定会遇到这个问题。 –

0

@Amrish

目前的MongoDB可以为每个集合只有一个2D指数,但是你可以有多重位置的文件。

地址: [ {LOC:[经度,纬度] //或{经度: “someValue中”,纬度: “someValue中”} 名: “启动” },

{LOC: [经度,纬度],//或{LON: “someValue中”,纬度: “someValue中”} 名称: “结束” }, ]

而且你可以在Address.loc

有2D指数

这可以帮助$ near和geoNear进行搜索,并且可以用于workaroun d搜索查找给定经纬度对附近的所有“开始”点

另请注意:它应该是(长,经纬度)对不反向。

]

0

看起来像SO已曲折的例子

不久,放(LNG,LAT)对,用名:启动或名称:结束。 制作上面的对数组 在上面的数组中放置2d索引。

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

而你应该能够使用AND/OR等操作进行上述两种操作

相关问题