2016-11-29 61 views
2

我有一个使用Mongoose和三个字段的架构设置。没有一个是必需的,但我想确保三个字段中至少有一个填充以防止空文档被保存(理想情况下,实际上我想确保至少填充了firstsecond字段)。什么是最好的方法来做到这一点? pre('save')看起来像一个选项,但认为应该有一个内置的方式来做到这一点。防止空文档被保存

var mySchema = new Schema({ 
    first: { 
    type: String, 
    trim: true 
    }, 
    second: { 
    type: String, 
    trim: true 
    }, 
    third: { 
    type: Number, 
    min: 1 
    } 
}, { 
    timestamps: true 
}); 

var My = mongoose.model('My', mySchema); 

回答

0

你可以有pre('save')正如你所提到或下面给出一个validation上的一个字段,检查这一条件。

var validateLocalStrategyProperty = function(property) { 
    return this.first || this.second || this.third); 
}; 

var mySchema = new Schema({ 
    first: { 
    type: String, 
    trim: true, 
    validate: [validateLocalStrategyProperty, 'Please fill at least one field'] 
    }, 
    second: { 
    type: String, 
    trim: true 
    }, 
    third: { 
    type: Number, 
    min: 1 
    } 
}, { 
    timestamps: true 
}); 

var My = mongoose.model('My', mySchema); 
+0

有趣。你知道什么是最佳做法吗? – bbodenmiller

+0

您可以与验证一起使用,因为它可以在每次保存文档时对每个字段进行更多控制 – Aruna

+1

验证检查,.pre()仅用于该特定查询。 –

0

Pre方法最适合这种用例。

mySchema.pre('save', function(next) { 
    var self = this; 
    if(self.first || self.second || self.third) { 
    next(); 
    } else { 
     next(new Error('At leat one of the filed should be there')) 
    } 
} 

还有一个选项,您介绍了一个中间件,它将验证您的请求并调用路由中的下一个函数。

+0

不要只在客户端做事情,总是检查服务器中的东西,因为客户端可以被利用! –

+0

是的,你是对的写中间件功能是在这种情况下最好的事情。避免客户端处理 –

+0

我总是这样做,以避免等待来自服务器的响应,但不会只在客户端。 –

-1

您可以为字段输入为空时将使用的字段设置默认值。

var mySchema = new Schema({ 
first: { 
    type: String, 
    trim: true, 
    default: 'your string or something' 
}, 
second: { 
    type: String, 
    trim: true, 
    default: 'your string or something' 
}, 
third: { 
    type: Number, 
    min: 1 
} 
}, { 
timestamps: true 
}); 

var My = mongoose.model('My', mySchema); 
+0

谢谢,但我不希望它保存,如果'first'和'second'都是空的。 – bbodenmiller

+0

好的,那么你可以使用Aruna的答案中提到的验证选项 –