在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,并设置回有效值。因此,它归结为人口+使用请求数据执行更新的组合。
答案 0 :(得分:0)
我认为这是因为undefined失败了Schema.Types.ObjectId验证。你应该使用$ unset,如
Employee.update({
//whatever query
},
{
$unset: { supervisor: true }
},
{ multi: true})