Задать вопрос
@de_angelo

Как сортировать пользователей по последнему сообщению в базе mongoose,nodejs?

Есть 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' })
  • Вопрос задан
  • 200 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 1
Robur
@Robur
Знаю больше чем это необходимо
что-то в духе:
.aggregate(
    [
        { "$match": { "to": 'admin'  } },    
    { "$group": {_id: "$authorId", "createdAt": {$max: "$cretedAt"}},
      {$lookup: {
 {
         from: "user",
         localField: "_id",
         foreignField: "_id",
         as: "user"
       }
        { "$sort": { "createdAt" : 1 } },
},
    ])
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы