Допустим, у нас есть коллекция MongoDB под названием «изображения» и приложение на базе MongoMapper с соответствующей моделью «Изображение». Если мы настроим запрос MongoMapper, используя эту модель, мы увидим, что он имеет тип Plucky::Query и возвращает результаты типа Image:
>> Image.where(:file_type => 'image/jpeg').class
=> Plucky::Query
>> Image.where(:file_type => 'image/jpeg').first.class
=> Image
Мы можем запустить соответствующий запрос непосредственно на адаптере Mongo, в основном в обход 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
Обновление: я не могу просто полностью обойти магию запросов MongoMapper, как я сделал во втором случае, потому что мне нужно получить доступ к функциям MongoMapper (конкретно названным областям) для создания запроса, поэтому в итоге я получаю Plucky::Query. Но тогда я хочу, чтобы результаты были простыми объектами данных, а не моделями, потому что все, что мне нужно, это данные, и мне не нужны накладные расходы на создание экземпляра модели.