У меня есть схема mongoose, которая хранит сообщения между пользователями:
const messageSchema = mongoose.Schema({
message:{ type: String },
sender: { type: mongoose.Schema.Types.ObjectId, ref: 'User'},
recipient: { type: mongoose.Schema.Types.ObjectId, ref: 'User' }
},
{
timestamps: true
});
Я пытаюсь:
.find()
все сообщения, отправленные пользователю .populate()
поле отправителя из User
схемы .group()
сообщений sender.username
(username
заполняется с User
) - возвращает только самые последние(по дате тега) сообщение на отправителя
В настоящее время я делаю следующее:
let inbox = [];
let usercount = {};
await Messages.find({recipient: req.params.id})
.populate('sender')
.sort({updatedAt: -1})
.lean()
.then(messages => {
messages.forEach(message => {
let m = {
username: message.sender.username,
message: message.message
}
if (!usercount[message.sender.username]) inbox.push(m);
usercount[message.sender.username] = 1;
})
});
console.log(inbox);
, который дает мне массив, содержащий самое последнее сообщение, отправленное каждым username
,Однако для этого требуется две итерации: один раз над всем документом сообщения и снова над возвращенным объектом.
Есть ли способ достичь того же результата, используя .aggregate()
& group
)?