async virtuals? That's something much more fundamental, virtuals are sync by design so you can use assignment operator. Also there's really no after select hook - query middleware only works for these methods: https://github.com/LearnBoost/mongoose/blob/master/lib/schema.js#L11-17 and only when the operation is actually executed. For instance, MyModel.find({ test: 1 }).count(callback); will execute count middleware but not find, because the actual operation sent to the server is a count