docs: function(obj, options) {
  	options = _.defaults(options || {}, {
  		'reference': 'reference',
  		'access': true
  	});
  
  	this.doc = obj.doc || obj;
  	this.id = obj.id || obj._id;
  	this.view = options.view;
  
  	// make the "key" conform to the convention ["key"]
  	this.key = obj.key || this.doc[options.view];
  	this.key = _.isArray( obj.key ) ? obj.key : [ obj.key ];
  
  	// init the value object
  	if (_.isArray(options.related_facet)) {
  		this.value = _.reduce(options.related_facet, function(result, fV) {
  			result[fV] = {};
  			return result;
  		}, {});
  	} else {
  		this.value = _.object([options.related_facet], [{}]);
  	}
  	
  	// make the value accessible via the "key";
  	if (this.doc && options.view) {
  		if (!_.contains(['key', 'value', 'id', 'doc', 'view'], options.view)) {
  			this[options.view] = this.doc[options.view];
  		}
  	}
  
  	// Default behavior when "options.related_facet" is present:
  	// calculate a new value set when the requested "key" is not the "key" used to compute the index.
  	// NB: this over-writes the .value fetched from the server;
  	if (options.related_facet && this.hasOwnProperty('doc') &&
  			this.getAlias('type') !== options.reference) {
  		this.setValues(this._getRelatedValues(options.related_facet));
  	}
  	return this;
  }