2013-10-08 292 views
0

這裏是設置:mongo_mapper查詢返回任何結果,在DB返回直接查詢結果

的Gemfile:

gem 'mongo_mapper', '>= 0.13.0.beta1' 
gem 'plucky', '>= 0.6.5' 

控制器:

@job = Job.where(:admin_id => a.id) 

滑軌控制檯輸出(記錄器):

@job is [] 

一個「a .ID」值恰好是:

a.id is 51ddbd6b972791243d0000f1 

蒙戈直接查詢:

db.jobs.find({ admin_id: "51ddbd6b972791243d0000f1" }) 

>>>Lots of stuff<<< 

多少?

> db.jobs.find({ admin_id: "51ddbd6b972791243d0000f1" }).count() 
202 

那麼 - 爲什麼當直接在蒙戈完成並返回從控制器調用時一個空數組該查詢返回的結果?

更具體地 - 這裏是簡單的循環:

@tech_d = [] 
    @tech.each do |a| 
     Rails.logger.info("a.id is " + a.id) 
     @job = Job.where(:admin_id => a.id) 
     Rails.logger.info("@job is " + @job.to_a.to_s) 

其中產量像這樣的東西:

a.id is 51ddbd6b972791243d0000f1 
@job is [] 
a.id is 51f976f2811d830002000adc 
@job is [] 

但正如我已經證明了 - 做的時候有結果,以這種簡單的查詢直接在Mongo。

**編輯 - 我已經試過mongo_mapper寶石0.12.0的GA版本,其結果都是一樣的(降級勇敢到0.5.2匹配 - 無變化)

回答

0

你有沒有結果,因爲如你使用它只會創建查詢。

您將需要通過附加.all

@job = Job.where(:admin_id => a.id) 

將返回 '執行' 它:

=> #<Plucky::Query admin_id: "51ddbd6b972791243d0000f1", transformer: #<Proc:[email protected]/var/lib/gems/1.9.1/gems/mongo_mapper-0.12.0/lib/mongo_mapper/plugins/querying.rb:76 (lambda)>> 

你應該這樣做:

@job = Job.where(:admin_id => a.id).all 

or simply 

@job = Job.all(:admin_id => a.id) 

見下段從這裏: http://mongomapper.com/documentation/plugins/querying.html#criteria

Mongo對動態查詢擁有豐富的支持。 MongoMapper使用Plucky到 構造查詢代理對象,當 需要時,它只能從Mongo檢索數據。這允許查詢在被評估之前由多個條件 組成。

+0

不 - 對不起 - 這不是答案。我試過Job.where(查詢),Job.all(查詢),Job.where({查詢}),Job.all({查詢}),甚至瘋狂與Job.find(當然不是一個mongo_mapper函數)。我一直在使用Mongo和Plucky一段時間,並且在我的應用程序中執行許多像這樣的查詢。特別是對這個有點奇怪。 – notaceo

0

拍我的臉,答案竟然是字符串化吧...

a.id.to_s,而不是在查詢a.id。

這是如此重擊。我可以Rails.logger.info(a.id)並得到正確的輸出 - 沒有to_s方法 - 但我必須將它查詢到...

耶穌,這是如此明顯,它傷害了我。

+0

記錄隱式調用傳遞給它的數據to_s。看起來問題在於,您要在數據庫中存儲字符串ID而不是BSON ID - 通常建議禁止這種情況。 –

+0

克里斯 - 我感謝評論,根據我的經驗記錄語句不隱式地調用to_s數據。許多次,很多次我刷新頁面只看到「沒有將X隱式轉換爲字符串」,我總是必須返回並在var上添加to_s。這發生在Date對象,Time對象,Mongo plucky查詢,JSON,任何整數/數組中。從字面上看,所有的事情都需要我手動添加to_s來讓它顯示在記錄器中。請教我如何告訴Logger隱式添加to_s--這對我有很大的幫助。 – notaceo

+0

對不起,我相信這是調用'#inspect'而不是'#to_s'。請參閱https://gist.github.com/cheald/dd95008667ff5992fb44 - 我相信問題在於您在數據庫中具有字符串ID而不是BSON ID;他們是不同的類型,並被視爲這樣。 –