我正在使用MEAN堆栈创建一个应用程序,其中我有一对一的聊天功能。我使用mongoose并有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命令以获取最新消息,因此在单个请求中对数据库进行了很多查找操作。即为什么我需要一些解决方案,如为每个对话填充最新消息(就像我可以使用对话的_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)
}
})
});
}
})
先谢谢