我有一个模型,其中car属性是可选的,但是car嵌套文档中有一些属性,如果用户有car,例如cartype : {required: true},但是在定义car时,这是必需的。

 var UserSchema = new Schema({
        email: {
            type: 'String',
            required: true
        },
        car: {
            carType: {
               // should be required if user have car
               type: 'Number',
               default: TransportType.Car
            },
        }
    })

最佳答案

如果default没有carType值,则可以如下定义一个函数hasCarrequiredcarType

var UserSchema = new Schema({
    email: {
        type: 'String',
        required: true
    },
    car: {
        carType: {
           type: 'Number',
           required: hasCar,
           //default: TransportType.Car
        },
    }
});

function hasCar() {
    return JSON.stringify(this.car) !== JSON.stringify({});//this.car; && Object.keys(this.car).length > 0;
}


带有测试代码

var u1 = new UUU({
    email: '[email protected]'
});

u1.save(function(err) {
    if (err)
        console.log(err);
    else
        console.log('save u1 successfully');
});

var u2 = new UUU({
    email: '[email protected]',
    car: {carType: 23}
});

u2.save(function(err) {
    if (err)
        console.log(err);
    else
        console.log('save u2 successfully');
});


结果:

{ "_id" : ObjectId("56db9d21d3fb99340bcd113c"), "email" : "[email protected]", "__v" : 0 }
{ "_id" : ObjectId("56db9d21d3fb99340bcd113d"), "email" : "[email protected]", "car" : { "carType" : 23 }, "__v" : 0 }




但是,如果default的值为carType,则这里可能是一种解决方法

var UserSchema = new Schema({
    email: {
        type: 'String',
        required: true
    },
    car: {
        carType: {
           type: 'Number',
           required: hasCar,
           default: 1
        },
    }
});

function hasCar() {
    if (JSON.stringify(this.car) === JSON.stringify({carType: 1})) {
        this.car = {};
    }
    return JSON.stringify(this.car) === JSON.stringify({});
}

UserSchema.pre('save', function(next){
    // if there is only default value of car, just remove this default carType from car
    if (JSON.stringify(this.car) === JSON.stringify({carType: 1})) {
        delete this.car;
    }
    next();
});


使用以上测试代码,结果是

{ "_id" : ObjectId("56db9f73df8599420b7d258a"), "email" : "[email protected]", "car" : null, "__v" : 0 }
{ "_id" : ObjectId("56db9f73df8599420b7d258b"), "email" : "[email protected]", "car" : { "carType" : 23 }, "__v" : 0 }

09-27 04:03