在一个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})