docs: function generateCursorApi(fnName) {
          return function (query, projections) {
              var cursorOptions = _.pick(query, '$$sort', '$$skip', '$$limit', '$$projection');
              query = _.omit.apply(_, _.flatten([query, _.keys(cursorOptions)]));
  
              if (_.keys(cursorOptions).length || projections) {
                  projections && (cursorOptions.$$projection = projections);
  
                  var cursor = new C(db[fnName](query));
                  _.reduce(_.keys(cursorOptions), function (c, method) {
                      return c[method.replace('$$','')](cursorOptions[method]);
                  }, cursor);
  
                  return cursor.exec();
              }
  
              return convertToPromise(db, fnName, arguments,
                  (fnName === 'find' ? dbCallbacks.find : (fnName === 'findOne' ? dbCallbacks.findOne : null)));
          };
      }