2016-02-26 58 views
2

我無法使用Model.find(id)查找記錄。Model.find不適用於mongoid

Food.find('548210e8d5a81037af06b2d6') => Mongoid::Errors::DocumentNotFound 

但是,當我嘗試使用列名找到相同的記錄時,我將返回相同的記錄。

Food.where({name:"Aloo Matar" }).first 
=> #<Food _id: 548210e8d5a81037af06b2d6, rawOrPrepared: "P", name: "Aloo Matar", tags: "vegetable", alternateNames: "potatoes"> 

對我而言,根據字符串找到不同的作品。請參閱下面的代碼。

Food.where({_id: "zyCMnbTPENeXkhawT" }) 
=> #<Mongoid::Criteria 
    selector: {"_id"=>"zyCMnbTPENeXkhawT"} 
    options: {} 
    class: Food 
    embedded: false> 

2.2.1 :017 > Food.where({_id: '548210e8d5a81037af06b2d6' }) 
=> #<Mongoid::Criteria 
    selector: {"_id"=>BSON::ObjectId('548210e8d5a81037af06b2d6')} 
    options: {} 
    class: Food 
    embedded: false> 

但是第一個代碼返回對象,而第二個代碼引發異常。

請幫我解決這個問題。

感謝, 野兔

+0

_id是一個看起來像'BSON :: ObjectId'還是一個真正的'BSON :: ObjectId'的字符串? ''db.foods.findOne({_id:'548210e8d5a81037af06b2d6'})''從'mongodb' CLI工具中說了什麼?如何'db.foods.findOne({_id:ObjectId('548210e8d5a81037af06b2d6')})'? –

+0

從mongo控制檯,我能夠找到數據。請參閱mongo客戶端的以下代碼。 db.foods.find({_ id:「548210e8d5a81037af06b2d6」}) {「_id」:「548210e8d5a81037af06b2d6」,「manufacturer」:「自制」,「修改」:「2014-12-10T06:47:56.275Z」 ,「name」:「Aloo Matar」} > > db.foods.find({_ id:「zyCMnbTPENeXkhawT」}) {「_id」:「zyCMnbTPENeXkhawT」,「name」:「Recipe_281015072818」,「tags」 「配方」,「製造商」:「自制」,「alternateNames」:「糙米和胡蘿蔔」,「修改」:「2015-10-28T07:28:20.542Z」} –

+0

我可以從mongodb客戶端獲取這些數據。 –

回答

0

你的問題已經發生了,因爲你改變了你的模型,並稱_id字段應具有字符串類型之前,_id等於548210e8d5a81037af06b2d6保存文檔。

我想你在將數據插入數據庫之後,會在模型中插入類似下面的代碼。對?

所以......所發生的事情與文件ID爲548210e8d5a81037af06b2d6

簡單。該文檔保存爲默認mongodb _id類型 - 即ObjectId

現在只要您查詢DB與548210e8d5a81037af06b2d6(定義_id類型的字符串)後,它會嘗試找到ID等於548210e8d5a81037af06b2d6一個文件,但它不會找到,因爲它被存儲爲ObjectId('548210e8d5a81037af06b2d6')

如果您從模型中刪除field :_id, type: String, overwrite: true,您會看到文檔548210e8d5a81037af06b2d6將再次找到,而zyCMnbTPENeXkhawT不會。

因此,爲了解決你的問題,你必須將mongodb上的每個id轉換爲相同的類型。

相關問題