Звиняйте, но у вас тут сразу несколько ошибок:
1. В начальных условиях рейтинг отрицательный что несколько странно. Обычно изначальный рейтинг должен быть 0. -1 там ошибка - лучше просто запретить голосовать за себя.
2. При таком подходе вам нужны aggregations. Только я бы в таком случае как - минимум ограничивал поиск по дате, и по количеству голосов.
Причина в том что тут нет никакой магии - агрегации достаточно тяжелы в расчётах, и копать ими ради рейтинга несколько сотен тысяч топиков с 10-летней давностью не имеет смысла.
Смотрите пример тут:
stackoverflow.com/questions/20585135/mongodb-get-a...