不同值的MongoDB聚合

人气:185 发布:2022-10-16 标签: mongodb distinct aggregation-framework

问题描述

我有两个收藏:

用户

{
_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_id2inbox_id3)。

我知道我需要对其使用聚合,但不确定具体如何使用。

推荐答案

我能够根据类似的问题解决它:MongoDB : Aggregation framework : Get last dated document per grouping ID

我的解决方案如下:

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'},
    }},
]);

188