在undefined / null子文档ObjectId字段上设置值会产生Cast to ObjectId错误

时间:2015-02-24 08:39:56

标签: mongodb mongoose meanjs objectid

在MEAN.js应用程序中,我有一个具有subdoc 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将导致相同的错误。这个错误来自哪里?它指的是什么(当我发送未定义的值时)?

我对猫鼬来说相对较新。这感觉就像一个根本问题,很可能是用户错误。如果我没有使用正确的模式,请告诉我。我使用的是mongoose 3.8.8,而我的速度为3.8.23,但无济于事。

编辑:可能非常重要的一点是,当员工返回客户时,管理员会被填充。使用MEAN样板快速控制器进行更新似乎存在问题,该控制器将已更改状态的_.assign执行到发送到客户端的req.employee数据。

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

1 个答案:

答案 0 :(得分:0)

我认为这是因为undefined失败了Schema.Types.ObjectId验证。你应该使用$ unset,如

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