不同值的MongoDB聚合 [英] MongoDB aggregation for distinct values
本文介绍了不同值的MongoDB聚合的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有两个收藏:
用户
{
_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
)。
我知道我需要对其使用聚合,但不确定具体如何使用。
推荐答案
我能够根据类似的问题解决它: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'},
}},
]);
这篇关于不同值的MongoDB聚合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文