Why compound wildcard index still do fetch?

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