/**
  * Returns an object containing basic information about the execution of the query that created
  * this cursor This creates a <code>DBObject</code> with the key/value pairs: "cursor" : cursor
  * type "nScanned" : number of records examined by the database for this query "n" : the number of
  * records that the database returned "millis" : how long it took the database to execute the
  * query
  *
  * @return a <code>DBObject</code>
  * @dochub explain
  */
 public DBObject explain() {
   DBCursor c = copy();
   c._explain = true;
   if (c._limit > 0) {
     // need to pass a negative batchSize as limit for explain
     c._batchSize = c._limit * -1;
     c._limit = 0;
   }
   return c.next();
 }
 /**
  * Creates a copy of an existing database cursor. The new cursor is an iterator, even if the
  * original was an array.
  *
  * @return the new cursor
  */
 public DBCursor copy() {
   DBCursor c = new DBCursor(_collection, _query, _keysWanted, _readPref);
   c._orderBy = _orderBy;
   c._hint = _hint;
   c._hintDBObj = _hintDBObj;
   c._limit = _limit;
   c._skip = _skip;
   c._options = _options;
   c._batchSize = _batchSize;
   c._snapshot = _snapshot;
   c._explain = _explain;
   if (_specialFields != null) c._specialFields = new BasicDBObject(_specialFields.toMap());
   return c;
 }