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 文件的下一行?