I'm not sure if an index here will help you, especially since you are looking up by _id already. There are some limitations with covered indexes, specifically that they can only return top-level document entries (though this may change in the future). However, even if this were not the case, since the index would have to hold the count_map contents, it would likely be about as large as your collection itself, so you would be no more likely to be able to serve the results of this query from RAM from a covered index than from the collection itself.
One possible cause of the slowness you're seeing could be in how either MongoDB or Mongoengine are processing the field inclusion/exclusion lists. If you have many arguments to the .only(...) call (you don't say how many you are specifying), one could imagine that both in the database and in the ODM processing this list could take considerable time, possibly more than in your application code itself. It's certainly the case that MongoDB has to do more work with field inclusion/exclusion, as it has to create a new BSON document to return to you, rather than just streaming the BSON from memory in the data files. Have you tried returning full documents from MongoDB, and then only selecting the sub-documents that you need (e.g. in a loop over the equivalent of the arguments you're passing to only())?
Hope this helps,
- Dan Crosta