2015-02-24 25 views
0

里面一个MEAN.js的应用程序,我有一个具有subdoc的参考架构:设置在一个未定义/ null的子文档ObjectID字段的值会产生铸造到的ObjectId错误

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

我能使用或不使用监督员字段,从模式创建模型。如果该值设置为创建,那么我就能来取消它,像这样:

employee.supervisor = undefined; 

employee.save(function(err) { 
... 

然而,如果该字段值是不确定的已经,那么我就无法在其后设置的任何值 - 这将产生以下错误:

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

事实上,在试图再次将该值设置为不确定的,具有相同的.save代码路径,会导致同样的错误。这个错误来自哪里?它指的是什么(当我发送一个未定义的值)?

我对猫鼬比较新。这感觉像是一个基本问题,并且很可能是用户错误。如果我没有使用正确的模式,请告诉我。我正在使用猫鼬3.8.8,我转移到3.8.23,无济于事。

编辑:一些可能很重要的事情是,当员工返回给客户时,主管人员已经填充。使用MEAN boilerplate express控制器进行更新似乎存在一个问题,即执行将已更改状态的_.assign发送给发送给客户端的req.employee数据。

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

回答

0

我认为这是因为未定义的Schema.Types.ObjectId验证失败。你应该在

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

使用$取消设置为按[链接](http://stackoverflow.com/questions/4486926/delete-a-key-from-a-mongodb-document-using-mongoose)未定义+保存等同于更新+未设置。这不是这种情况吗? – 2015-02-25 01:43:32