У меня есть документ User
, который содержит массив messages
. Этот массив messages
заполняется Conversations
документами, чья User
является частью.
const userSchema = new mongoose.Schema({
// classic infos (password, email, etc.)
messages: [{ type: Schema.types.ObjectId, ref: "Conversation" }]
}
const conversationSchema = new mongoose.Schema(
{
name: { type: String, required: true, unique: true },
senderId: { type: Schema.Types.ObjectId, ref: "User" },
recipientId: { type: Schema.Types.ObjectId, ref: "User" },
messageList: [{ message: { type: String }, author: { type: String } }],
latestMessage: {
author: { type: String },
msgSnippet: { type: String },
read: { type: Boolean },
},
default: null,
},
{ timestamps: true }
);
conversationSchema.index({ name: 1 });
Когда кто-то пишет сообщение в Conversation
, поле latestMessage
обновляется. Таким образом, клиент может знать, что есть непрочитанные сообщения, если автор latestMessage
отличается от пользователя клиента, а read
имеет значение false. read
будет обновлено до true
, когда получатель откроет диалог.
На данный момент этот метод требует извлекать все latestMessage
разговора на каждой странице refre sh, чтобы выполнить долгую проверку. Можно ли автоматически обновлять пользователя с полем hasUnreadMessage
после каждой новой публикации?
Внимание, hasUnreadMessage
не должен переключаться на false
только из-за одного логика разговора c. В самом деле, что если в других разговорах есть непрочитанные сообщения для него? Кажется, что промежуточное ПО «pre» может творить чудеса, но я пока не мастер в этом.
Спасибо!