# File lib/mongo/collection.rb, line 214
    def find(selector={}, opts={})
      opts               = opts.dup
      fields             = opts.delete(:fields)
      fields             = ["_id"] if fields && fields.empty?
      skip               = opts.delete(:skip) || skip || 0
      limit              = opts.delete(:limit) || 0
      sort               = opts.delete(:sort)
      hint               = opts.delete(:hint)
      named_hint         = opts.delete(:named_hint)
      snapshot           = opts.delete(:snapshot)
      batch_size         = opts.delete(:batch_size)
      timeout            = (opts.delete(:timeout) == false) ? false : true
      max_scan           = opts.delete(:max_scan)
      return_key         = opts.delete(:return_key)
      transformer        = opts.delete(:transformer)
      show_disk_loc      = opts.delete(:show_disk_loc)
      comment            = opts.delete(:comment)
      read               = opts.delete(:read) || @read
      tag_sets           = opts.delete(:tag_sets) || @tag_sets
      acceptable_latency = opts.delete(:acceptable_latency) || @acceptable_latency

      if timeout == false && !block_given?
        raise ArgumentError, "Collection#find must be invoked with a block when timeout is disabled."
      end

      if hint
        hint = normalize_hint_fields(hint)
      else
        hint = @hint        # assumed to be normalized already
      end

      raise RuntimeError, "Unknown options [#{opts.inspect}]" unless opts.empty?

      cursor = Cursor.new(self, {
        :selector           => selector,
        :fields             => fields,
        :skip               => skip,
        :limit              => limit,
        :order              => sort,
        :hint               => hint || named_hint,
        :snapshot           => snapshot,
        :timeout            => timeout,
        :batch_size         => batch_size,
        :transformer        => transformer,
        :max_scan           => max_scan,
        :show_disk_loc      => show_disk_loc,
        :return_key         => return_key,
        :read               => read,
        :tag_sets           => tag_sets,
        :comment            => comment,
        :acceptable_latency => acceptable_latency
      })

      if block_given?
        begin
          yield cursor
        ensure
          cursor.close
        end
        nil
      else
        cursor
      end
    end