Есть 2 коллекции.
messanges
authorId
to (кому - мне всегда admin)
createdAt
text
users
_id
avatarURL
name
использую mongoose.
Задача по смыслу стоит вроде простая.
Отсортировать список пользователей которые писали последними, и выдать информация о них.
1. я отсортировал сообщения по дате, чтобы увидеть последние сообщения
2. сгруппировал пользователей по их ИД, чтобы убрать дубли - тем самым получив список пользователей
которые писали последними.
3. так как у меня не получилось как либо Джоин (популейт) в коде я циклом выврал информацию о пользователях.
4. можно ли в этом же запросе отоброзить последнее сообщение из сортировки, а то мне приходиться опять в базу запрос слать.
Верна ли моя логика выбора и сортировки из базы - потому что иногда он сортирует сообщения по разному.
Как мне грамотно сделать всёдке выбор при помощи aggregate, выбор и джоин?
(я не смог сделать никак lookup - вроде информация простая)
Могут быть идиоткий код - я не так давно пишу на nodejs
сonst mess = await Message
.aggregate(
[
{ "$match": { "to": 'admin' } },
{ "$sort": { "createdAt" : 1 } },
{ "$group": {"_id": {"authorId": "$authorId",}}}
])
//SEARCH USER BY MESS ID AFTER SORT
let allusers = new Array();
let n=0;
for (const item of mess) {
users0 = await Users.find({_id: item._id.authorId});
allusers.push(users0.map(u => u.toDTO()));
}
res.render('_ajax/messanges', {messusers: allusers})
Я попробовал так, но distinct и сорт вместе не работают
messusers = await Message
.find({to: 'admin'})
.sort({createdAt: 'asc'})
.distinct('authorId')
.populate({ path: 'authorId', select: 'avatarURL name' })