【问题标题】:MongoDB aggregation for distinct values不同值的 MongoDB 聚合
【发布时间】:2016-05-10 05:00:01
【问题描述】:

我有 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_id2inbox_id3)。

我知道我需要为此使用聚合,但不确定如何准确。

【问题讨论】:

  • 您的 MongoDB 服务器版本是多少?

标签: mongodb aggregation-framework distinct


【解决方案1】:

我能够根据类似的问题解决它: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'},
    }},
]);

【讨论】:

  • 我在我的测试数据集上运行了这个,我收到 oldest 消息而不是 newest - 请检查您的数据集
  • @profesor79 确实如此。我首先根据时间戳对它们进行排序,然后从第一个文档(具有最新时间戳的文档)中提取字段
猜你喜欢
  • 2018-05-25
  • 1970-01-01
  • 2013-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
相关资源
最近更新 更多