2016-05-10 16 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它的確如此。我首先根據時間戳對它們進行排序,然後從第一個文檔(具有最近時間戳的文檔)中提取字段, –