Агрегация 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'},
}},
]);