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

时间:2015-03-17 03:13:51

标签: node.js mongodb mongoose

尽管已经多次询问过这种情况,但通常是因为该实体对该字段没有有效的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,因为即使在稍后重新设置它之后,文档/实体在构造函数中使用值集也是非常不直观的行为。

1 个答案:

答案 0 :(得分:3)

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

serviceFromDB=new Service();