1

「画像」と呼ばれる 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返すため、これは何らかの形で拡張されているか、上記のものとは異なることがわかります。ImageBSON::OrderHash

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

更新: MongoMapper の機能 (具体的にはスコープという名前) にアクセスしてクエリを作成する必要があるため、2 番目のケースのように MongoMapper クエリ マジックを単純にバイパスすることはできませんPlucky::Query。しかし、必要なのはデータだけであり、モデルのインスタンス化のオーバーヘッドが必要ないため、結果をモデルではなくプレーンなデータ オブジェクトにしたいと考えています。

4

2 に答える 2

1

ドライバーにドロップすると、トランスフォーマーはnilデフォルトで次のようになります。

1.9.3p194 :003 > Image.collection.find({ :file_type => 'image/jpeg' }, { :limit => 1 }).first.class
 => BSON::OrderedHash 
于 2013-02-27T21:10:11.113 に答える
1

MongoMapper は、プルーキー クエリに「トランスフォーマー」ラムダを設定することで変換を実現します。これは、MongoMapper ソース コードで確認できます。

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

...

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

したがって、各 mongo ドキュメントの取得後Plucky::Query、モデルをロードする変換が実行されます。Plucky のソース コードを見ると、[]これを無効にするために使用できる簡単なセッター メソッドがあることがわかります。これが解決策です:

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
于 2013-02-27T21:05:52.870 に答える