User.remove({ name : /Simon/ } , function (err){ if (!err){ // 删除名字中包含simon的所有用户 } }); User.findOne({ email : 'simon@theholmesoffice.com'},function (err,user){ if (!err){ user.remove( function(err){ // 删除匹配到该邮箱的第一个用户 }); } });
接下来看一下findOneAndRemove方法:
User.findOneAndRemove({name : /Simon/},{sort : 'lastLogin', select : 'name email'},function (err, user){ if (!err) { console.log(user.name + " removed"); // Simon Holmes removed }; });
另外一个findByIdAndRemove方法则是如出一辙的。
User.findByIdAndRemove(req.body._id,function (err, user) { if(err){ console.log(err); return; } console.log("User deleted:", user); });
四、数据验证
1.mongoose内置数据验证
在mongoose中,数据验证这一层是放在schema中的,mongoose已经帮我们做了很多内置的数据验证,有一些验证是针对某些数据类型的,也有一些是针对所有数据类型的。
能够作用在所有数据类型上的验证有require,意思就是该字段是否是必须的,例如:
email: { type: String, unique: true, required: true }
上面的代码就定义了一个email是必须的schema.
下面再分别介绍一下mongoose内置的一些数据验证类型。
数字类型schemasType,对于Number类型的数据,具有min,max提供用来界定最大最小值:
var teenSchema = new Schema({ age : {type: Number, min: 13, max:19} });
字符串类型SchemasType,对于该类型数据,mongoose提供了两种验证器:
match:可使用正则表达式来匹配字符串是否符合该正则表达式的规则
enum:枚举出字符串可使用的一些值
分别举例如下:
var weekdaySchema = new Schema({ day : {type: String, match: /^(mon|tues|wednes|thurs|fri)day$/i} }); var weekdays = ['monday', 'tuesday', 'wednesday', 'thursday','friday']; var weekdaySchema = new Schema({ day : {type: String, enum: weekdays} });
在我们进行一些数据库的时候,如果有错误,可能会返回一些错误信息,这些信息封装在一个对象中,该对象的数据格式大致如下:
{ message: 'Validation failed', name: 'ValidationError', errors:{ email:{ message: 'Validator "required" failed for path email', name: 'ValidatorError', path: 'email', type: 'required' }, name:{ message: 'Validator "required" failed for path name', name: 'ValidatorError', path: 'name', type: 'required' } } }
知道该错误信息的具体格式之后,我们可以从中得出我们想要的信息并反馈到控制台。
if(err){ Object.keys(err.errors).forEach(function(key) { var message = err.errors[key].message; console.log('Validation error for "%s": %s', key, message); }); }
2.自定义数据验证
最简单的自定义数据验证方式就是定义一个数据验证的函数,并将它传递给schema;
var lengthValidator = function(val) { if (val && val.length >= 5){ return true; } return false; }; //usage: name: {type: String, required: true, validate: lengthValidator }
可以看到,我们只需要在schema中添加validate键值对即可,validate对应的值便是我们自定义的验证方法;
但是该形式的数据验证无法给我们提供完整的错误信息,比如errors信息中返回的type值就会成为undefined;
在此基础上如果希望错误信息中能返回一个错误描述,那我们可以稍微进行一点修改:
//code 1 validate: { validator: lengthValidator, msg: 'Too short' } //code 2 var weekdaySchema = new Schema({ day : {type: String, validate: {validator:/^(mon|tues|wednes|thurs|fri)day$/i, msg: 'Not a day' } });
将validate的值修改为一个对象,并且该对象包含验证器和错误描述。
我们也可以使用另一种方式在写这些验证器,就是将验证器卸载schema外部,例如:
var validateLength = [lengthValidator, 'Too short' ]; var validateDay = [/^(mon|tues|wednes|thurs|fri)day$/i, 'Not a day' ]; //usage: name: {type: String, required: true, validate: validateLength } day : {type: String, validate: validateDay }
眼睛放大,一看再看,确实没错,在validate中我们传入的是一个数组了,而不是原来的对象了。
其实就validateLength这个东东来说,他就是一个简写来的,你也可以改成下面这样:
var validateLength = [ {validator: lengthValidator, msg: 'Too short'} ];
恩,到这里,应该能明白了,将对象改为数组之后,我们便可以传递多个验证器给我们的schema了,的确如此。
var validateUsername = [ {validator: lengthValidator, msg: 'Too short'} , {validator: /^[a-z]+$/i, msg: 'Letters only'} ];
我们还有另外一种方法给我们的schema提供验证器:
userSchema.path('name').validate(lengthValidator, 'Too short'); userSchema.path('name').validate(/^[a-z]+$/i, 'Letters only');