2

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

我想编写如下查询。

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

其中 location_src 和 location_dest 是经纬度格式的 gui 输入。

但是,当我尝试通过写入Result.first或访问结果时Result.all,它会说 Mongo::OperationFailure: can't have 2 special fields.

谁能建议我有什么解决方法?

亲切的问候,阿姆里什。

4

4 回答 4

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"。

于 2012-09-20T12:54:15.050 回答
1

目前 Mongodb 仅支持每个集合 1 个地理索引。这是记录在案的,从这个页面

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

于 2012-09-20T10:54:50.387 回答
0

@Amrish

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

地址 : [ {loc:[Lon,Lat], // or {lon: "somevalue" , lat:"somevalue"} name:"start" },

{loc:[Lon,Lat], // 或 {lon: "somevalue" , lat:"somevalue"} name:"end" }, ]

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

这对搜索 $near 和 geoNear 很有帮助,并可用于解决方法来搜索查找靠近给定 lat-lng 对的所有“起点”点

另请注意:它应该是 (long,lat) 对而不是反向。

]

于 2012-11-04T14:58:44.120 回答
0

看起来SO有之字形的例子

很快,将 (lng,lat) 对放在 name:start 或 name:end 中。使上述对的数组将二维索引放在上面的数组上。

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

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

于 2012-11-04T15:02:31.927 回答