Для этого в топике нужно хранить дату последнего сообщения.
Дело в том, что нужно для каждого пользователя сортировать топики по сообщению именно для него, а в вашем случаи сортировка будет просто по последнему сообщению не важно для кого.
Пока пришел к беседующему решению
schema.statics.getTopicList = function (userId, offset, callback) {
var Topic = this;
,q = [
{$unwind: "$messages"},
{$match: {$or: [{"messages.to": userId}, {"messages.from": userId}]}},
{$sort: {"messages.date_created": -1}},
{$group: {
_id: "$_id",
"title":{$first: "$title"},
"date_last_message":{$first: "$messages.date_created"},
"date_created":{$first: "$date_created"},
}
},
{$sort: {"date_last_message": -1}},
];
if(offset != undefined) {
q.push({$skip: (config.get('topic:limit') * offset)});
q.push({$limit: config.get('topic:limit')});
}
this.aggregate(q,function(err, topics) {
if(err) return callback(err);
callback(null,topics);
});
};