2013-02-27 4 views
1

Предположим, у нас есть коллекция MongoDB под названием «изображения», а приложение MongoMapper с соответствующей моделью «Изображение». Если мы создали запрос MongoMapper с использованием этой модели, мы видим, что это приводит типа Plucky::Query и возвратов типа Image:Как получить исходные данные Mongo от MongoMapper Plucky :: Объект запроса?

>> Image.where(:file_type => 'image/jpeg').class 
=> Plucky::Query 

>> Image.where(:file_type => 'image/jpeg').first.class 
=> Image 

Мы можем запустить соответствующий запрос непосредственно на адаптере Монго, в основном, минуя MongoMapper, по доступ к MongoMapper.connection. Если мы делаем это таким образом, запрос имеет тип Mongo::Cursor и возвращает исходные результаты данных типа BSON::OrderedHash:

>> MongoMapper.connection.db(dbname).collection('images').find({ :file_type => 'image/jpeg' }).class 
=> Mongo::Cursor 

>> MongoMapper.connection.db(dbname).collection('images').find({ :file_type => 'image/jpeg' }).first.class 
=> BSON::OrderedHash 

Вопрос заключается в том, есть ли способ, чтобы взять Plucky::Query как выше, и преобразовать его (или получить от него) базовый, не расширенный объект Mongo::Cursor?

Сначала я думал, что я нашел решение с find_each, который на самом деле взять Plucky::Query и возвращать Mongo::Cursor:

>> Image.where(:file_type => 'image/jpeg').find_each.class 
=> Mongo::Cursor 

Но оказывается, что это Mongo::Cursor каким-то образом расширить или иным образом отличается от приведенной выше, потому что она по-прежнему возвращает Image объектов вместо BSON::OrderHash объектов:

>> Image.where(:file_type => 'image/jpeg').find_each.first.class 
=> Image 

Update: Я просто не могу обойти магический MongoMapper запроса альта gether, как и во втором случае, потому что мне нужно получить доступ к функциям MongoMapper (специально названных областей) для создания запроса, поэтому в итоге я получаю Plucky::Query. Но тогда я хочу, чтобы результаты были объектами данных, а не моделями, потому что все, что мне нужно, это данные, и я не хочу накладных расходов на создание экземпляра модели.

ответ

1

MongoMapper достигает конверсии, устанавливая «трансформатор» лямбда на плотный запрос. Вы можете увидеть это в MongoMapper source code:

def query(options={}) 
    query = Plucky::Query.new(collection, :transformer => transformer) 
    ... 
end 

... 

def transformer 
    @transformer ||= lambda { |doc| load(doc) } 
end 

Таким образом, после каждого извлечения Монго документа, это Plucky::Query запускает преобразование, которое загружает модель. Глядя на Plucky source code, мы видим, что существует простой способ настройки [], который мы можем использовать, чтобы отключить это. Так что это решение:

plucky_query = Image.where(:file_type => 'image/jpeg') 

plucky_query.first.class 
# => Image 

plucky_query[:transformer] = nil 
plucky_query.first.class 
# => BSON::OrderedHash 

Если вы не возражаете, обезьяны заплат можно инкапсулировать так:

module Plucky 
    class Query 
     def raw_data 
      self[:transformer] = nil 
      self 
     end 
    end 
end 

Тогда вы могли бы просто написать:

Image.where(:file_type => 'image/jpeg').raw_data.first.class 
# => BSON::OrderedHash 
1

Если вы падение к водителю, трансформатор nil по умолчанию:

1.9.3p194 :003 > Image.collection.find({ :file_type => 'image/jpeg' }, { :limit => 1 }).first.class 
=> BSON::OrderedHash 
+0

Спасибо, но это не сработает в моем случае, потому что я хочу использовать функции MongoMapper для создания исходного запроса. Я уточняю свой вопрос, чтобы подробно остановиться на этом вопросе. –

 Смежные вопросы

  • Нет связанных вопросов^_^