docs: function(o, fields, callback) {
      
      var single, self = this;
  
      if (callback == null) {
        callback = fields;
        fields = null;
      } else if (fields instanceof Array) {
        fields = fields.reduce(function(ob, current) {
          ob[current] = 1;
          return ob;
        }, {});
      }
  
      if (typeof o == 'number' || typeof o == 'string' || o instanceof ObjectID) { 
        
        // If `o` is number: Convert to object
        o = {_id: o};
        single = true;
        
      } else if (o instanceof Array) {
  
        // If `o` is an array of params, process args recursively using multi
        var arr = o;
        var multi = this.multi();
        
        for (var i=0; i < arr.length; i++) {
          multi.get(arr[i], fields);
        }
        
        return multi.exec(function(err, docs) {
          docs = docs.filter(function(val) {
            return val; // Filter null values
          });
          callback.call(self, err, docs);
        });
        
      } else if (o.constructor === Object) {
        
        // IF `o` is object: Validate without checking required fields
        this.propertyCheck(o);
  
      } else {
  
        return callback.call(self, new Error(util.format("%s: Wrong value for `o` argument", this.className)), null);
  
      }
      
      // Convert `id` to `_id`
      convertMongoID(o);
      
      // Set single if ID is specified in query
      if (o._id) single = true; 
      
      this.driver.queryWhere({
        collection: this.context,
        condition: o,
        fields: fields || {},
        exArgs: {
          sort: [['_id', 'desc']]
        }
      }, function(err, docs) {
        if (err) callback.call(self, err, null);
        else {
          if (docs.length === 0) {
            callback.call(self, null, single ? null : []);
          } else if (single) {
            callback.call(self, null, self.createModel(docs[0]));
          } else {
            for (var models=[],i=0; i < docs.length; i++) {
              models.push(self.createModel(docs[i]));
            }
            callback.call(self, null, models);
          }
        }
      });
    }