db.users.find({"age" : {"$gte" : 25, "$lte" : 35}}).sort({"username" : 1}).limit(100)
советуется брать следующий индекс {"username" : 1, "age" : 1}, вместо
{"age":1,"username":1}.
А должно быть наоборот.
Зачастую (но не всегда) порядок такой:
1) Фильтр на точные значения
2) Поля сортировки
3) Фильтр на "выборочные" значения (массивы).
В вашем случае ("age" : {"$gte" : 25, "$lte" : 35}) - это как бы точное значение (т.к. оно укладывается в "a < x < b"), далее идет сортировка ("username" : 1).
Т.е. получается монга "берет" пачку данных ...24,|25<=age<=35|,36... где в каждом из возрастов выбирает все значения по порядку т.к. они уже отсортированы.
Если индекс будет наоборот ({"username" : 1, "age" : 1}), то монга будет "входить" как бы в каждый username, брать из каждого вхождения диапазон 25<=age<=35, а потом сортировать все данные. - т.е. сортировка в начале тут лишняя.
Как то так.
Очень важно что-б сортировка "не ломалась" при проходе по индексу.
Вот полезная статья.