CustomQuery = function(criteria, options) {
    if (!(this instanceof CustomQuery)) {
      return new CustomQuery(criteria, options);
    }
    this._mongooseOptions = clone(p._mongooseOptions);
    Query.call(this, criteria, options || null, model, coll);
  }
Converts this query to a customized, reusable query constructor with all arguments and options retained.

#### Example:

    // Create a query for adventure movies and read from the primary
    // node in the replica-set unless it is down, in which case we'll
    // read from a secondary node.
    const query = Movie.find({ tags: 'adventure' }).read('primaryPreferred');

    // create a custom Query constructor based off these settings
    const Adventure = query.toConstructor();

    // further narrow down our query results while still using the previous settings
    await Adventure().where({ name: /^Life/ }).exec();

    // since Adventure is a stand-alone constructor we can also add our own
    // helper methods and getters without impacting global queries
    Adventure.prototype.startsWith = function (prefix) {
      this.where({ name: new RegExp('^' + prefix) })
      return this;
    }
    Object.defineProperty(Adventure.prototype, 'highlyRated', {
      get: function () {
        this.where({ rating: { $gt: 4.5 }});
        return this;
      }
    })
    await Adventure().highlyRated.startsWith('Life').exec();

@return {Query} subclass-of-Query
@api public