我无法使用Model.find(id)找到记录。
Food.find('548210e8d5a81037af06b2d6') => Mongoid::Errors::DocumentNotFound
但是当我尝试使用列名找到相同的记录时,我将返回相同的记录。
Food.where({name:"Aloo Matar" }).first
=> #<Food _id: 548210e8d5a81037af06b2d6, rawOrPrepared: "P", name: "Aloo Matar", tags: "vegetable", alternateNames: "potatoes">
对于我的情况,find基于字符串的工作方式不同。请参阅以下代码。
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 :(得分:0)
您的问题已经发生,因为在您更改模型之前保存了_id
等于548210e8d5a81037af06b2d6
的文档,表示_id
字段应该包含字符串类型。
我想您在将该文档插入数据库后,将类似下面的代码插入到模型中。正确?
field :_id, type: String, overwrite: true
那么...... ID为548210e8d5a81037af06b2d6
的文档会发生什么?
简单。该文档使用默认的mongodb _id
类型保存 - 即ObjectId
。
现在(在将_id
类型定义为字符串后)每当您使用548210e8d5a81037af06b2d6
查询数据库时,它都会尝试查找ID等于548210e8d5a81037af06b2d6
的文档,但它会赢得&#t查找,因为它存储为ObjectId('548210e8d5a81037af06b2d6')
。
如果您从模型中删除field :_id, type: String, overwrite: true
,则会发现548210e8d5a81037af06b2d6
会再次找到文档zyCMnbTPENeXkhawT
,而initial
则不会。
因此,要解决您的问题,您必须将mongodb上的每个id转换为相同的类型。