docs: function (collectionName, id, cacheKey, callback) {
      var self = this;
  
      check(collectionName, String);
      // id is some sort of scalar
      check(cacheKey, String);
  
      // If there's already an in-progress fetch for this cache key, yield until
      // it's done and return whatever it returns.
      if (_.has(self._callbacksForCacheKey, cacheKey)) {
        self._callbacksForCacheKey[cacheKey].push(callback);
        return;
      }
  
      var callbacks = self._callbacksForCacheKey[cacheKey] = [callback];
  
      Fiber(function () {
        try {
          var doc = self._mongoConnection.findOne(
            collectionName, {_id: id}) || null;
          // Return doc to all relevant callbacks. Note that this array can
          // continue to grow during callback excecution.
          while (!_.isEmpty(callbacks)) {
            // Clone the document so that the various calls to fetch don't return
            // objects that are intertwingled with each other. Clone before
            // popping the future, so that if clone throws, the error gets passed
            // to the next callback.
            var clonedDoc = EJSON.clone(doc);
            callbacks.pop()(null, clonedDoc);
          }
        } catch (e) {
          while (!_.isEmpty(callbacks)) {
            callbacks.pop()(e);
          }
        } finally {
          // XXX consider keeping the doc around for a period of time before
          // removing from the cache
          delete self._callbacksForCacheKey[cacheKey];
        }
      }).run();
    }