I believe the issue is with the $ne part of the query.
In general it is difficult to use an index to find "not matches".
There is actually a note on this on our FAQ page:
http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ#IndexingAdviceandFAQ-I%27musing%24neor%24nininaquery%2Candwhileitusestheindex%2Cit%27sstillslow.What%27shappening%3F
Similar questions regarding "not equals" queries have been asked in
the past "How to index queries with $nin and $ne filters?" -
http://groups.google.com/group/mongodb-user/browse_thread/thread/e8da8bfcd9605d30
If possible, it would be best to rearrange your query to perform a
"positive match".
One possible solution is to add a field to each document similar to
"HasExceptions". This will be true if the "Exceptions" array is
populated, and false if it is not. You can then include this field in
your index, and change your query to something like the following:
> db.collection.ensureIndex({"AppID" : 1, "HasExceptions" : 1, "TimeCompleted" : 1})
> db.collection.find({"AppID" : 94, "HasExceptions":true}).sort({"TimeCompleted" : -1})
I realize this involves a little extra overhead on inserts and updates
(determining if the "Exceptions" array is empty and changing
"HasExceptions" accordingly, but you should see a noticeable
improvement in query time.