2016-05-10 1 views
0

У меня есть 2 коллекции:агрегации 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(), 
} 

Всякий раз, когда пользователь входит в его почтовый ящик, я хотел бы чтобы показать ему список тем, в который должен входить список lat сообщений от каждого пользователя. Поэтому в основном я хотел бы получить отдельные документы (на основе поля from._id) и только последний документ (на основе поля timestamp).

Таким образом, мои результаты для user2 должны включать только 2 документа (inbox_id2 и inbox_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. Сначала я сортирую их на основе метки времени, а затем извлекаю поля из первого документа (который совпадает с самой последней меткой времени) –