「画像」と呼ばれる MongoDB コレクションと、対応する「画像」モデルを持つ MongoMapper を利用したアプリケーションがあるとします。このモデルを使用して MongoMapper クエリを設定すると、それが type であり、 typePlucky::Query
の結果を返すことがわかりImage
ます。
>> Image.where(:file_type => 'image/jpeg').class
=> Plucky::Query
>> Image.where(:file_type => 'image/jpeg').first.class
=> Image
にアクセスすることで、ほとんどの場合 MongoMapper をバイパスして、対応するクエリを Mongo アダプターで直接実行できますMongoMapper.connection
。このようにすると、クエリは typeであり、 typeMongo::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 の機能 (具体的にはスコープという名前) にアクセスしてクエリを作成する必要があるため、2 番目のケースのように MongoMapper クエリ マジックを単純にバイパスすることはできませんPlucky::Query
。しかし、必要なのはデータだけであり、モデルのインスタンス化のオーバーヘッドが必要ないため、結果をモデルではなくプレーンなデータ オブジェクトにしたいと考えています。