我正在构建实时聊天系统。对于这个问题,我有以下模型:
conversation_model.js
const conversationSchema = new mongoose.Schema({
name: String,
created_at: {type: Date, default: Date.now}
});
message_model.js
const messageSchema = new mongoose.Schema({
message: String,
user_id: Number,
user_type: String,
message_type: Number,
sent_date_time: {type: Date, default: Date.now},
deleted: {type: Boolean, default: false},
conversation: {type: mongoose.Schema.Types.ObjectId, ref: "Conversation", index: true}
});
message_status_model.js
const messageStatusSchema = new mongoose.Schema({
user_id: Number,
user_type: String,
status: Boolean,
read_at: {type: Date},
message: {type: mongoose.Schema.Types.ObjectId, ref: "Message", index: true}
});
每当一条消息保存在消息集合中时,它就会通过插入了对话消息的对话进行引用。
message_status模型也是如此,即当插入一条消息后,message_status表将为会话的所有参与者保存消息的已读/未读状态。
现在,我想标记为用户已读会话中的所有消息。 从前端我会收到session_id和user_id以及user_type。
现在,我必须在message_status模型中为给定会话中给定用户的所有未读消息标记为已读(status = true)。
说到SQL,我可以通过联接对话,message和message_status表仅过滤那些属于给定对话的消息,从而简单地查找和更新用户的所有message_status记录。
但是在猫鼬的情况下,由于没有连接,我无法通过session_id找到所有messages_status。
因此,在这种情况下,我必须首先找到收敛中的所有消息,然后找到找到的每条消息的所有message_status记录,然后更新我认为过于费钱的操作。
是否可以通过单个findAndUpdate操作来做到这一点?
我尝试使用填充方法,但是您可能知道填充方法不会通过子对象的填充方法中传递的条件来过滤子记录。