Issue title: Validation of Sub Schemas, contained in an array, throws an error.
 Issue body: I am getting the following error message (below) when trying to update a collection, which contains a subschema defined in an array (see model). I am using v3.8.12 of Mongoose.

Error Message:

```
TypeError: Object #<Object> has no method 'validate'
  at /Users/benstaker/workspace/htdocs/bigtop/api-2/node_modules/mongoose/lib/schema/documentarray.js:95:13
  at /Users/benstaker/workspace/htdocs/bigtop/api-2/node_modules/mongoose/lib/schema/documentarray.js:103:9
  at DocumentArray.SchemaType.doValidate (/Users/benstaker/workspace/htdocs/bigtop/api-2/node_modules/mongoose/lib/schematype.js:603:22)
  at DocumentArray.doValidate (/Users/benstaker/workspace/htdocs/bigtop/api-2/node_modules/mongoose/lib/schema/documentarray.js:73:35)
  at /Users/benstaker/workspace/htdocs/bigtop/api-2/node_modules/mongoose/lib/document.js:956:9
  at process._tickDomainCallback (node.js:459:13)
```

Model:

```
var MediaItem = new Schema({
  // Link to wrap the media in
  link: { type: String, default: '' },

  // Provider of the media, i.e.: YouTube, Cloudinary, etc
  provider: {
    name: { type: String, default: '' },
    other: []
  },

  // Source url of the media
  source: { type: String, default: '' },

  // Size of the media in bytes
  filesize: { type: Number, default: 0 },

  // Format, i.e.: JPEG, PNG, etc
  format: { type: String, default: '' },

  // Filename, the original filename the user uploaded
  filename: { type: String, default: '' },

  // Resolution in pixels
  resolution: {
    height: { type: Number, default: 0 },
    width: { type: Number, default: 0 }
  }
});

var Media = new Schema({
  // Details regarding the media
  details: {
    // User ID
    user: { type: String },

    // Account ID
    account: { type: String },

    // Apps using this media item
    apps: [ { type: String } ],

    // Type of media, i.e.: Image, Video, Audio, etc
    type: { type: String, required: true },

    // Main title, default to filename
    title: { type: String, default: 'Loading...', required: true },

    // Alternative text
    alt: { type: String, default: '' },

    // Global URL, i.e. for a slideshow
    globalLink: { type: String, default: '' },

    // Alignment of the media, i.e.: left, center, right
    alignment: { type: String, default: 'left' },

    // How the media should fit, i.e.: original, crop, scale
    fit: { type: String, default: 'scale' },

    // Background options
    background: {
      // Position of the background, i.e. top-left
      position: { type: String, default: 'top left' },

      // Whether to repeat the background, i.e. no-repeat
      repeat: { type: String, default: 'repeat' }
    },

    // Image quality
    quality: { type: Number, default: 80 },

    // Slideshow configuration
    slideshow: {
      animation: {
        // Type of the animation, i.e.: Swipe Left
        type: { type: String, default: 'swipe-left' },

        // Speed of animation, i.e. slow, medium, fast
        speed: { type: String, default: 'slow' }
      },

      // Whether to display the pager and arrows
      pagerAndArrows: { type: Boolean, default: false }
    },

    // Video/audio player options
    player: {
      // Whether to autoplay the media
      autoplay: { type: Boolean, default: false },

      // Whether it should loop through the media, i.e. replay.
      loop: { type: Boolean, default: false },

      // Whether to show the media controls, i.e. play/pause
      showControls: { type: Boolean, default: false }
    },

    originalHeight: { type: Number, default: 0 },
    originalWidth: { type: Number, default: 0 }
  },

  // Array of media items
  items: [MediaItem]
},
{
    toObject: { virtuals: true },
    toJSON: { virtuals: true }
});
```

Validate call:

```
schema.statics.updateWithValidation = function (id, updates, callback) {
  var self = this;

  self.findOne({ _id: id }, function (err, doc) {
    if (err) return callback(err);
    if (!doc) {
      return callback(new Error('Could not update document, document not found.'));
    }

    // Remove mongoose properties
    delete updates._id;
    delete updates.id;
    delete updates.__v;

    // Merge updates into document (lodash)
    _.merge(doc, updates);

    // Validate the document
    // outputs: 'validating document: *ID* function'
    console.log('validating document: ', doc._id, typeof doc.validate);
    doc.validate(function (err) {
      if (err) {
        console.log('error!');
        return callback(err);
      }

      // Update the document
      self.update(
        { _id: id },
        { $set: updates },
        {},
        function (err, affected) {
          if (err) return callback(err);
          return callback(err, doc.toObject());
        }
      );
    });
  });
};
```

 Comments: 
 Comment 0: Updating to version v3.8.14 seems to have fixed the issue?

 Comment 1: Hmm interesting. Well, glad its fixed :)

{'source': 'GithubIssues', 'repo_name_with_owner': 'Automattic/mongoose', 'issue_id': 39081378, 'repo_stars': 24931.0}