Suggest Hash element assignment or #store over #merge! of a trivial hash, perhaps the following.

    def special_selector
      query =      { :$query => selector }
      [
          [ :$readPreference, read_pref ],
          [ :$orderby, sort ],
          [ :$hint, hint ],
          [ :$comment, comment ],
          [ :$snapshot, snapshot ],
          [ :$maxScan, max_scan ],
          [ :$showDiskLoc, show_disk_loc ]
      ].each do |symbol, value|
        query[symbol] = value if value
      end
      query
    end

Perhaps we could simplify further if we more closely followed convention and used #read_preference instead of #read_pref along with some flavor of camelize and friends.