2

我无法使用 Model.find(id) 找到记录。

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

但是当我尝试使用 column name 查找相同的记录时,我将返回相同的记录。

 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>

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

请帮助我。

谢谢,野兔

4

1 回答 1

0

您的问题已经发生,因为在您更改模型之前保存了_id等于的文档,说该字段应该具有字符串类型。548210e8d5a81037af06b2d6_id

我想您在将文档插入数据库后将类似以下代码的内容插入到您的模型中。正确的?

field :_id, type: String, overwrite: true

那么...带有 id 的文档发生了什么548210e8d5a81037af06b2d6

简单的。该文档以默认 mongodb_id类型保存 - 即ObjectId.

现在(在将_id类型定义为字符串之后)每当您使用 查询 DB 时548210e8d5a81037af06b2d6,它都会尝试查找 id 等于548210e8d5a81037af06b2d6但它不会找到的文档,因为它存储为ObjectId('548210e8d5a81037af06b2d6').

如果您field :_id, type: String, overwrite: true从模型中删除,您会看到该文档548210e8d5a81037af06b2d6将再次被找到,而zyCMnbTPENeXkhawT不会。

因此,要解决您的问题,您必须将 mongodb 上的每个 id 转换为相同的类型。

于 2017-10-30T14:59:55.017 回答