Можно ли превратить массив, возвращаемый командой Mongo GeoNear (с использованием Ruby / Rails), в объект Plucky? - PullRequest
0 голосов
/ 10 декабря 2011

Как новичок, я пытался заставить команду geoNear работать в моем приложении rails, и, похоже, она работает нормально. Для меня главное раздражение в том, что он возвращает массив со строками, а не ключами, которые я могу вызвать для извлечения данных.

Покопавшись, я понимаю, что MongoMapper использует Plucky для превращения результирующего запроса в дружественный объект, который может быть легко обработан, но я не смог выяснить, как преобразовать результат моего запроса geoNear в plucky объект.

Мои вопросы: (а) Можно ли превратить это в отважный предмет и как мне это сделать? (б) Если это невозможно, как я могу наиболее просто и систематически извлечь каждую запись и каждое поле?

вот запрос в моем контроллере

@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 голосов
/ 04 января 2012

Хорошо, давайте предположим, что вы сохраняете результаты в переменной под названием place_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
...