По хорошему фильтр и сортировка должны соответствовать индексу.
Если нужна максимальная скорость то нужно упростить запрос, избавится от $or и доп. условий, например сделать так:
1) в документ сохранять готовое значение sender+recipient которое проходит условие, например: { _search1: {user_id1: user_id1, user_id2: user_id2} } (записать ид пользователей в порядке нарастания), заполнять этот массив если выполняются условия с mType, deleted, read, action.
2) Сделать индекс: db.mail.ensureIndex({_search1: 1, "date" : -1 })
В итоге запрос выдаст результат быстро и с учетом всех условий:
collection.find({ _search:{user_id1: user_id1, user_id2: user_id2} }).sort({date: -1})
Если сортировать идентификаторы не хочется, то можно сделать массивом:
{ _search:[sender, recipient] }, и запрос
collection.find({ _search:{$all: [sender, recipient]} }).sort({date: -1})
, для этого случая возможно лучше будет такой индекс: db.mail.ensureIndex({ "date" : -1, _search1: 1 })