Mongoose:在设置值后,新创建的对象上的值转换为 ObjectId 失败 [重复]

Posted

技术标签:

【中文标题】Mongoose:在设置值后,新创建的对象上的值转换为 ObjectId 失败 [重复]【英文标题】:Mongoose: Cast to ObjectId failed for value on newly created object after setting the value [duplicate] 【发布时间】:2015-05-19 09:16:38 【问题描述】:

尽管这已被多次询问,但通常是因为实体没有该字段的有效 ObjectId。

我遇到了这样一种情况,即 ObjectId 被设置为一个可以转换为 ObjectId 的值,但仍然出现此错误。

架构:

var serviceSchema = paramMongoose.Schema(
  serviceName: 
   type: paramMongoose.Schema.Types.ObjectId
   , ref: 'servicenames',required:true 
  
);

伪代码:

serviceFromDB=new Service(serviceName:'some Name');
serviceFromDB.serviceName='000000000000000000000001';
serviceFromDB.save(function(paramError,paramData)
  if(paramError)
    console.log('but but but...',serviceFromDB,paramError)
  
);

这段代码的输出是:

但是但是但是... serviceName: 000000000000000000000001, _id: 55079a90286f49280364f78b [CastError: Cast to ObjectId failed for value "some Name" at path "serviceName"]

请注意,serviceName 可以转换为 ObjectId,但 mongoose 使用提供给构造函数的值而不是之后设置的值。

使用documented set function 会导致同样的错误:

serviceFromDB.set('serviceName','000000000000000000000001');

这是更新或插入实体的代码,以便稍后设置字段。解决方案是在不传递参数的情况下创建服务实例:

serviceFromDB=new Service();

为此打开了issue,因为即使在稍后重新设置之后,使用构造函数中设置的值也是文档/实体非常不直观的行为。

【问题讨论】:

一个完全不相关的答案被标记为重复?我的朋友也可以谷歌搜索并使用so搜索,但该答案与导致问题的原因无关。很多事情都可能导致此错误,例如查询或尝试使用非 casteble 值进行填充。这里的问题描述了一个保存操作,即使在错误中记录的对象具有有效的对象 ID,但 mongoose 尝试将一个值强制转换为不再是当前值的 ObjectId。 是的,我认为他们在这个问题上有点过火了。审稿人请注意,这与重复的错误相同,但原因和修复不同。 【参考方案1】:

解决方案是在不传递参数的情况下创建服务实例:

serviceFromDB=new Service();

【讨论】:

以上是关于Mongoose:在设置值后,新创建的对象上的值转换为 ObjectId 失败 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

创建新对象时,猫鼬中的值不会增加

在用户输入值而不覆盖以前的值后,如何写入 .csv 文件的下一行?

创建新模式对象后,Mongoose 引用的字段丢失

设置值后如何在 UITextField 中移动光标

角度 6:在选择“选择”的值后尝试循环抛出一个对象(通过 *ngFor)

Next JS / mongoose:在保存新对象之前将 ObjectId 分配到数组中