2013-02-27 3 views
1

"이미지"라는 MongoDB 컬렉션과 해당 "이미지"모델이있는 MongoMapper 기반의 애플리케이션이 있다고 가정 해 보겠습니다. 에 의해,MongoMapper Plucky :: Query 개체에서 원시 Mongo 데이터 결과를 얻는 방법?

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

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

우리는 대부분 MongoMapper을 우회 몽고 어댑터에 직접 해당 쿼리를 실행할 수 있습니다 우리가이 모델을 사용하여 MongoMapper 쿼리를 설정 한 경우, 우리는 유형 Image의 유형 Plucky::Query 반환 결과의 것을 볼 수 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 객체?

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

그러나이 Mongo::Cursor 어떻게 든 확장 또는 위의 하나 때문에에서 다른 다릅니다 밝혀 :

는 처음에 내가 실제로 Plucky::Query을하고 Mongo::Cursor을 반환하지 find_each와 솔루션을 찾을 생각

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

업데이트 : 여전히 Image 객체 대신 BSON::OrderHash 오브젝트를 돌려 나는 단순히 MongoMapper 쿼리 마법 알토을 무시할 수 없습니다 gether 내가 MongoMapper (구체적으로 이름이 지정된 스코프)의 기능에 액세스하여 쿼리를 작성해야하기 때문에 두 번째 경우에서했던 것처럼, 결국 내가 Plucky::Query입니다. 그러나 필요한 것은 데이터 뿐이므로 모델 인스턴스가 아닌 오버 헤드를 원하지 않기 때문에 모델이 아닌 일반 데이터 객체를 결과로 원합니다.

답변

1

MongoMapper는 plucky 쿼리에서 "트랜스포머"람다를 설정하여 변환을 수행합니다. 당신은 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을 보면 단순한 setter 메서드 인 []이 있습니다.이 메서드를 사용하면이 기능을 해제 할 수 있습니다.

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

단순히 작성할 수 :

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

plucky_query.first.class 
# => Image 

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

것은 당신이 원숭이 패치 당신과 같이 캡슐화 할 수 있습니다 괜찮다면 :

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

당신이 만약 지금이 해결책이다 드라이버로 내려 가면 변압기는 기본적으로 입니다.

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

고맙지 만 MongoMapper의 기능을 사용하여 원본 쿼리를 작성하기 때문에 필자의 경우에는 작동하지 않습니다. 나는이 점을 상세히 설명하기 위해 나의 질문을 업데이트한다. –