function completeOne(model, doc, res, options, fields, userProvidedFields, pop, callback) {
  if (options.includeResultMetadata && doc == null) {
    _init(null);
    return null;
  }

  helpers.createModelAndInit(model, doc, fields, userProvidedFields, options, pop, _init);

  function _init(err, casted) {
    if (err) {
      return callback(err);
    }


    if (options.includeResultMetadata) {
      if (doc && casted) {
        if (options.session != null) {
          casted.$session(options.session);
        }
        res.value = casted;
      } else {
        res.value = null;
      }
      return callback(null, res);
    }
    if (options.session != null) {
      casted.$session(options.session);
    }
    callback(null, casted);
  }
}
hydrates a document

@param {Model} model
@param {Document} doc
@param {Object} res 3rd parameter to callback
@param {Object} fields
@param {Query} self
@param {Array} [pop] array of paths used in population
@param {Function} callback
@api private