docs: function (DB_name, name, onDone, prefix) {
  
  	//LOG.warn('init ' + DB_name + ' collection: ' + name, 'SR.DB');
  
  	if (l_DBclient.hasOwnProperty(DB_name) === false) {
  		LOG.error('DBclient not init or authenticated for DB [' + DB_name + ']', 'SR.DB');
  		return UTIL.safeCall(onDone, false);
  	}
  
  	// check if already init
  	if (l_getCollection(name, undefined, DB_name) !== undefined) {
  		LOG.warn('DB [' + DB_name + '] collection [' + name + '] already loaded', 'SR.DB');
  		LOG.warn('please check if different codes are using the same collection names', 'SR.DB');
  		// NOTE: we assume double declaration of collection name is ok
  		return UTIL.safeCall(onDone, true);
  	}
  
  	// build collection name to prefix with server name or a specified prefix
  	var collection_name = (prefix || SR.Settings.SERVER_INFO.name) + ':' + name;
  
  	// original simple version
  	//var collection_name = name;
  
  	l_DBclient[DB_name].collection(collection_name,
  		function (err, collection) {
  			if (err) {
  				LOG.error(err, 'SR.DB');
  				LOG.error('init DB [' + DB_name + ' ] collection [' + collection_name + '] error', 'SR.DB');
  				UTIL.safeCall(onDone, false);
  			} else {
  				// store each name as a collection entry in collection object
  				// collection name, instance(conn) , cache (idx by _id)
  				var msg = 'init DB [' + DB_name + '] collection [' + collection_name + '] success';
  				LOG.debug(msg, 'SR.DB');
  				if (l_clts.hasOwnProperty(DB_name) === false) {
  					l_clts[DB_name] = {};
  				}
  
  				// store collection instance into a two-level map
  				l_clts[DB_name][name] = collection;
  
  				// attach entity list to collection (for object caching)
  				l_clts[DB_name][name].cache = {};
  
  				UTIL.safeCall(onDone, true);
  			}
  		}
  	);
  }