Mongoose中的动态验证

时间:2016-03-05 21:33:20

标签: node.js mongoose

我有模型,其中car属性是可选的,但是汽车嵌套文档中有一些属性,如果User有汽车,如cartype : {required: true},但是定义汽车时应该是必需的。

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

1 个答案:

答案 0 :(得分:1)

如果default没有carType值,我们可以将hasCar的{​​{1}}函数定义为required,如下所示

carType

使用测试代码

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: 'test.user1@email.com'
});

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

var u2 = new UUU({
    email: 'test.user1@email.com',
    car: {carType: 23}
});

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

但是,如果{ "_id" : ObjectId("56db9d21d3fb99340bcd113c"), "email" : "test.user1@email.com", "__v" : 0 } { "_id" : ObjectId("56db9d21d3fb99340bcd113d"), "email" : "test.user1@email.com", "car" : { "carType" : 23 }, "__v" : 0 } 的{​​{1}}值为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();
});