# File lib/mongo/collection/view/readable.rb, line 136
        def count(opts = {})
          cmd = { :count => collection.name, :query => filter }
          cmd[:skip] = opts[:skip] if opts[:skip]
          cmd[:hint] = opts[:hint] if opts[:hint]
          cmd[:limit] = opts[:limit] if opts[:limit]
          cmd[:maxTimeMS] = opts[:max_time_ms] if opts[:max_time_ms]
          cmd[:readConcern] = collection.read_concern if collection.read_concern
          Mongo::Lint.validate_underscore_read_preference(opts[:read])
          read_pref = opts[:read] || read_preference
          selector = ServerSelector.get(read_pref || server_selector)
          with_session(opts) do |session|
            read_with_retry(session) do
              server = selector.select_server(cluster)
              apply_collation!(cmd, server, opts)
              Operation::Count.new({
                                     :selector => cmd,
                                     :db_name => database.name,
                                     :options => {:limit => -1},
                                     :read => read_pref,
                                     :session => session
                                    }).execute(server)
              end.n.to_i
          end
        end