Model.find不能使用mongoid

时间:2016-02-26 14:51:37

标签: mongodb ruby-on-rails-4 mongoid mongoid4

我无法使用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>

但是第一个代码返回对象,而第二个代码引发异常。

请帮我解决这个问题。

谢谢, 野兔

1 个答案:

答案 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转换为相同的类型。