code: function(bson, ns, query, options) {
    var self = this;
    // Basic options needed to be passed in
    if (ns == null) throw new Error('ns must be specified for query');
    if (query == null) throw new Error('query must be specified for query');
  
    // Validate that we are not passing 0x00 in the collection name
    if (ns.indexOf('\x00') !== -1) {
      throw new Error('namespace cannot contain a null character');
    }
  
    // Basic options
    this.bson = bson;
    this.ns = ns;
    this.query = query;
  
    // Ensure empty options
    this.options = options || {};
  
    // Additional options
    this.numberToSkip = options.numberToSkip || 0;
    this.numberToReturn = options.numberToReturn || 0;
    this.returnFieldSelector = options.returnFieldSelector || null;
    this.requestId = Query.getRequestId();
  
    // special case for pre-3.2 find commands, delete ASAP
    this.pre32Limit = options.pre32Limit;
  
    // Serialization option
    this.serializeFunctions =
      typeof options.serializeFunctions === 'boolean' ? options.serializeFunctions : false;
    this.ignoreUndefined =
      typeof options.ignoreUndefined === 'boolean' ? options.ignoreUndefined : false;
    this.maxBsonSize = options.maxBsonSize || 1024 * 1024 * 16;
    this.checkKeys = typeof options.checkKeys === 'boolean' ? options.checkKeys : true;
    this.batchSize = self.numberToReturn;
  
    // Flags
    this.tailable = false;
    this.slaveOk = typeof options.slaveOk === 'boolean' ? options.slaveOk : false;
    this.oplogReplay = false;
    this.noCursorTimeout = false;
    this.awaitData = false;
    this.exhaust = false;
    this.partial = false;
  }
docs: ************************************************************
  QUERY
  ************************************************************