在未定义/为null的子文档ObjectId字段上设置值会产生“强制转换为ObjectId”错误



在一个MEAN.js应用程序中,我有一个具有子域ref:的架构

var EmployeeSchema = new Schema({
    supervisor: {
        type: Schema.Types.ObjectId, 
        ref: 'User',
    },
    ... 

无论是否设置supervisor字段,我都可以从模式创建模型。如果值是在创建时设置的,那么我可以这样取消设置:

employee.supervisor = undefined;
employee.save(function(err) {
...

然而,如果字段值已经没有定义,那么我以后就无法设置任何值了——这会产生以下错误:

CastError: Cast to ObjectId failed for value "[object Object]" at path "supervisor"

事实上,如果使用相同的.save代码路径再次尝试将值设置为undefined,将导致相同的错误。这个错误是从哪里来的?它所指的对象是什么(当我向它发送一个未定义的值时)?

我对猫鼬比较陌生。这感觉像是一个基本问题,很可能是用户错误。如果我没有使用正确的模式,请告诉我。我用的是猫鼬3.8.8,然后转到3.8.23,但没有用。

编辑:可能很重要的一点是,当员工返回客户时,主管会被填充。使用MEAN样板快速控制器进行更新似乎存在问题,该控制器将更改后的状态分配给发送给客户端的req.employe数据。

如果我再次手动查询员工,并设置/取消设置主管字段,那么我就可以毫无错误地获得预期的行为。这包括设置为未定义,以及设置回有效值。因此,它可以归结为population+使用请求数据执行更新的组合。

我认为这是因为undefined未通过Schema.Types.ObjectId验证。你应该使用$unset作为

Employee.update({
  //whatever query
},
{
  $unset: { supervisor: true }
},
{ multi: true})

最新更新