Error handling
Errors returned after failed validation contain an errors object holding the actual ValidatorErrors. Each ValidatorError has a type and path property providing us with a little more error handling flexibility.
var ToySchema = new Schema({
    color: String
  , name: String
});
var Toy = db.model('Toy', ToySchema);
Toy.schema.path('color').validate(function (value) {
  return /blue|green|white|red|orange|periwinkel/i.test(value);
}, 'Invalid color');
var toy = new Toy({ color: 'grease'});
toy.save(function (err) {
  // previous behavior (v1x):
  console.log(err.errors.color)
  // prints 'Validator "Invalid color" failed for path color'
  // new v2x behavior - err.errors.color is a ValidatorError object
  console.log(err.errors.color.message)
  // prints 'Validator "Invalid color" failed for path color'
  // you can get v1 behavior back by casting error.color toString
  console.log(String(err.errors.color))
  // prints 'Validator "Invalid color" failed for path color'
  console.log(err.errors.color.type);
  // prints "Invalid color"
  console.log(err.errors.color.path)
  // prints "color"
  console.log(err.name)
  // prints "ValidationError"
  console.log(err.message)
  // prints "Validation failed"
});
BTW, the err.errors object is also available on the model instance.
toy.errors.color.message === err.errors.color.message
