【问题标题】:Mongoose : Cast to ObjectId failed for value "Some String" at path "_id"Mongoose:路径“_id”处的值“Some String”转换为 ObjectId 失败
【发布时间】:2020-11-10 07:31:54
【问题描述】:

MongoDB 新手,Javascript 堆栈,需要帮助了解此错误的原因。

我创建了我的模型:

const
Mongoose = require('mongoose');
Schema = Mongoose.Schema,
Model = Mongoose.model;

module.exports = Model('Project',
    new Schema({
        icon    : String,
        name    : String,
        state   : String,
        number  :  String 
        
    })
);

这是我的 MongoDB 文档:

[![MongoDB Document][1]][1]

我在调用 API 时尝试接收集合中的所有文档,因此根据 Mongoose 文档,我正在使用 find() 方法。

这是我的 API 实现:

const Project = require('../../models/project');
router.get('/projects/:page?/:limit?',
    function(req, res, next){
      const page = Math.max(req.params.page || 1, 1) - 1;
      const limit = Math.max(req.params.limit || 20, 20);

//Verified : I am hitting the API      
console.log("Reached API /projects"); 
  

     Project.find()
           .populate('icon')
           .populate('name')
           .populate('state')
         .populate('number')
         .limit(limit).skip(page * limit).exec(
         function(err, project)
          {
            if (err) { return next(err); }
           res.send(project);
          }
        ); //End of exec()
     
    }//End of unction
  );

我成功使用 fetch() 进行 API 调用,但我收到所有字符串值的“Cast to ObjectId failed error”。

我相信我的 Mongo DB 文档中有一些非常简单的东西可能会丢失。请帮助我理解并解决这个问题。

**编辑 ---

错误似乎指向键的字符串值:

**

谢谢

【问题讨论】:

  • 我不认为错误是由提供的代码引起的。有没有与_id 相关的代码?例如Project.findById(_id) ?
  • @thammada.ts 不,我没有使用任何 findById(_id) 方法。正如我在帖子中提到的,我正在尝试检索集合中的所有文档,所以我只使用了 find() 而不是 findById() 或 findOne()。
  • 是否还有其他带有 _id 的文档没有 ObjectId 的十六进制表示?

标签: javascript reactjs mongodb mongoose


【解决方案1】:

填充是自动将文档中的指定路径替换为其他集合中的文档的过程。所以你的Id cast是无效的,因为string,你需要有ObjectId,在它之前需要做一些修改,让我们调试一下:

const alldata = await Project.find()
console.log(alldata) // ?

这是否返回一些东西,我在这里使用async await 如果它返回数据,那么问题出在您的填充上,因为您的 Id 大小写无效,因为您保存在架构 string 中并且您在这里指的是填充,使用填充的示例:

module.exports = Model('Project',
    new Schema({
        icon    : [{ type: Schema.ObjectId, ref: 'your icon document' }],
        name    : [{ type: Schema.ObjectId, ref: 'you name document' }],
        state   : [{ type: Schema.ObjectId, ref: 'state document' }],
        number  :  [{ type: Schema.ObjectId, ref: 'number document' }] 
        
    })
);

但在我看来,您不需要使用填充,因为您有简单的数据、名称、数字......所以您应该很好地使用上面的示例

资源:mongoose fetching datausing populate, relation

【讨论】:

    猜你喜欢
    • 2017-05-26
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 2014-06-20
    • 2017-05-19
    • 2017-11-10
    • 2020-04-18
    • 2016-11-11
    相关资源
    最近更新 更多