尽管已经多次询问过这种情况,但通常是因为该实体对该字段没有有效的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:对于路径“serviceName”的值“some name”,Cast to ObjectId失败]
请注意, serviceName可以转换为ObjectId ,但是mongoose使用提供给构造函数的值而不是之后设置的值。
使用documented set function会导致同样的错误:
serviceFromDB.set('serviceName','000000000000000000000001');
这是更新或插入实体的代码,以便稍后设置字段。解决方案是在不传递参数的情况下创建服务实例:
serviceFromDB=new Service();
为此打开issue,因为即使在稍后重新设置它之后,文档/实体在构造函数中使用值集也是非常不直观的行为。
答案 0 :(得分:3)
解决方案是在不传递参数的情况下创建服务实例:
serviceFromDB=new Service();