是否可以将Mongo GeoNear命令返回的数组(使用Ruby / Rails)转换为Plucky对象?

时间:2011-12-10 02:03:29

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

作为一个新手,我一直试图让我的rails应用程序中的geoNear命令工作,它似乎工作正常。对我来说主要的烦恼是它返回一个带字符串而不是键的数组,我可以调用它来提取数据。

挖掘后,我明白MongoMapper使用Plucky将查询结果转换为友好的对象,可以轻松处理但是我无法找到如何将我的geoNear查询的结果转换为plucky对象

我的问题是: (a)是否有可能把它变成一个勇敢的对象,我该怎么做? (b)如果不可能,我怎样才能最简单,最系统地提取每个记录和每个字段?

这是我的控制器中的查询

@mult = 3963 * (3.14159265 / 180 ) # Scale to miles on earth
@results = @db.command( {'geoNear' => "places", 'near'=> @search.coordinates , 'distanceMultiplier' => @mult, 'spherical' => true})

这是我要回来的对象(为简单起见,删除了文档内容)

{"ns"=>"myapp-development.places", "near"=>"1001110101110101100100110001100010100010000010111010", "results"=>[{"dis"=>0.04356444023196527, "obj"=>{"_id"=>BSON::ObjectId('4ee6a7d210a81f05fe000001'),...}}], "stats"=>{"time"=>0, "btreelocs"=>0, "nscanned"=>1, "objectsLoaded"=>1, "avgDistance"=>0.04356444023196527, "maxDistance"=>0.0006301239824196907}, "ok"=>1.0}

非常感谢帮助!!

1 个答案:

答案 0 :(得分:0)

好的,我们假设您将结果存储到名为places_near的变量中:

places_near = t.command( {'geoNear' => "places", 'near'=> [50,50] , 'distanceMultiplier' => 1, 'spherical' => true})

此命令返回一个散列,该散列具有一个键(结果),该键映射到查询的结果列表。返回的文档如下所示:

{
    "ns": "test.places",
    "near": "1100110000001111110000001111110000001111110000001111",
    "results": [
    {
        "dis": 69.29646421910687,
        "obj": {
            "_id": ObjectId("4b8bd6b93b83c574d8760280"),
            "y": [
            1,
            1
            ],
            "category": "Coffee"
        }
    },
    {
        "dis": 69.29646421910687,
        "obj": {
            "_id": ObjectId("4b8bd6b03b83c574d876027f"),
            "y": [
            1,
            1
            ]
        }
    }
    ],
    "stats": {
        "time": 0,
        "btreelocs": 1,
        "btreelocs": 1,
        "nscanned": 2,
        "nscanned": 2,
        "objectsLoaded": 2,
        "objectsLoaded": 2,
        "avgDistance": 69.29646421910687
    },
    "ok": 1
}

迭代响应只需像在ruby中的任何列表上一样迭代:

places_near['results'].each do |result|
  # do stuff with result object
end