I think this is a very important point and detail that I have completely missed from the first post. The presence of hour in the index might indeed be detrimental to your use-case. Thanks Luke for pointing that out.
A few things to try
1- Remove hour from the index.
or
2- Move it after attributes
or
3- Keep hour where it is but add
hour : { $gte : 0 , $lte : 24 }to your $match if using $exists:true as proposed by Luke does not force the index