2016-05-10 15 views
0

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(), 
} 

每当用户进入他的收件箱,我想向他展示线程列表,其中应该包含一个lat列表est来自每个用户的消息。所以基本上我想获得截然不同的文档(基于from._id字段),并且只有最新的文档(基于timestamp字段)。

所以我的结果user2应该只包括2个文件(inbox_id2inbox_id3)。

我知道我需要为它使用聚合,但不知道具体如何。

+1

什么是你的MongoDB服务器的版本? – styvane

+0

最新的 - 3.2 –

回答

0

我能够基于类似的问题来解决这个问题: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'}, 
    }}, 
]); 
+0

我在我的测试数据集上运行了这个,我得到了**最早的**消息而不是**最新的** - 请检查您的数据集 – profesor79

+0

@ profesor79它的确如此。我首先根据时间戳对它们进行排序,然后从第一个文档(具有最近时间戳的文档)中提取字段, –