Агрегация MongoDB для разных значений

У меня есть 2 коллекции:

пользователь

{
_id: 'user_id1',
username: 'user1',
}

{
_id: 'user_id2',
username: 'user2',
}

{
_id: 'user_id3',
username: 'user3',
}

входящие

{
_id: 'inbox_id1',
from: {_id: 'user_id1', username: 'user1'},
to: {_id: 'user_id2', username: 'user2'},
text: 'Hello there',
timestamp: new Date(),
}

{
_id: 'inbox_id2',
from: {_id: 'user_id1', username: 'user1'},
to: {_id: 'user_id2', username: 'user2'},
text: 'Trying again...',
timestamp: new Date(),
}

{
_id: 'inbox_id3',
from: {_id: 'user_id3', username: 'user3'},
to: {_id: 'user_id2', username: 'user2'},
text: 'You there?',
timestamp: new Date(),
}

Всякий раз, когда пользователь входит в свой почтовый ящик, я хотел бы показать ему список тем, который должен включать список последних сообщений от каждого пользователя. В общем, я хотел бы получить различные документы (на основе from._id поле), и только самый последний документ (на основе timestamp поле).

Итак, мои результаты для user2 должно включать только 2 документа (inbox_id2 а также inbox_id3).

Я знаю, что для этого нужно использовать агрегацию, но не знаю, как именно.

1 ответ

Я смог решить ее на основе аналогичного вопроса: MongoDB: структура агрегации: получить последний документ с датой по идентификатору группы

Мое решение выглядит так:

db.inbox.aggregate([
    {$match : {'to.username': 'user2'}},
    {'$sort': {'from._id': 1, 'timestamp': -1}},
    {'$group': {
        '_id': '$from._id',
        'timestamp': {'$first': '$timestamp'},
        'text': {'$first': '$text'},
        'from': {'$first': '$from.username'},
    }},
]);
Другие вопросы по тегам