Я создаю приложение, используя стек MEAN, в котором у меня есть функция чата один на один. Я использую мангуст и имею 3 схемы:
Пользователи
{
name: {
type: String,
required: true
},
email: {
type: String
},
phone: {
type: Number,
required: true
},
profile_pic: {
type: String,
default: null
},
password: {
type: String
},
salt: {
type: String
}
}
Сообщения
{
message : {
type : String,
required : true
},
timestamp : {
type : Number,
required : true
},
from : {
type : String,
required : true
},
conversation_id : {
type : mongoose.Schema.Types.ObjectId,
required : true
}
}
Диалоги
{
users : [ {
type: type : mongoose.Schema.Types.ObjectId,
ref : User
}]
}
Теперь, когда пользователь идет к своему мессенджеру, я хочу показать ему все свои прошлые разговоры с последними сообщениями, поэтому сейчас я выполняю команду find в диалоге и заполняю пользователя
затем, после получения всех разговоров, я выполняю команду find для каждого диалога, чтобы получить их последнее сообщение, так что в этом случае в базе данных за один запрос выполняется очень много операций поиска. то есть, почему мне нужно какое-то решение, такое как заполнение последнего сообщения для каждого разговора (как я могу заполнить, используя _id разговора)
Редактировать
Вот код, который я сейчас использую:
let completeConversations = [];
conversation.find({ "users": req.body.token_data.id }).populate({ path: 'users', select: 'name profile_pic' }).exec((err, conversations) => {
if (err) throw err
if (conversations.length == 0) {
res.status(200);
res.json({ message: "No Conversations Found" })
} else {
conversations.forEach(element => {
messages.find({ conversation_id: element._id }).sort('-timestamp').limit(1).exec((err, message) => {
if (err) {
res.status(200);
res.json({ message: "Latest Message Not Found", conversations })
} else {
element = JSON.parse(JSON.stringify(element));
element.latest = message[0];
completeConversations.push(element);
}
if (completeConversations.length === conversations.length) {
res.json(completeConversations)
}
})
});
}
})
Заранее спасибо