Я создаю живую систему чата. У меня есть следующие модели для контекста этого вопроса:
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}
});
Всякий раз, когда сообщение сохраняется в коллекции сообщений, оно имеет ссылку через диалог, в который было вставлено сообщение диалога.
То же самое относится и к модели messages_status, т. Е. Когда сообщение вставляется, таблица message_status сохраняет состояние чтения / непрочитанного сообщения для всех участников беседы.
Теперь я хочу отметить прочитанные все сообщения в беседе для пользователя.
С внешнего интерфейса я получаю разговор_идентификатора и user_id и user_type.
Теперь мне нужно пометить read (status = true) в модели message_status для всех непрочитанных сообщений данного пользователя в данном разговоре.
Говоря об SQL, я мог бы просто найти и обновить все записи message_status пользователя, отфильтровывая только те сообщения, которые принадлежат данному разговору, путем объединения беседы, сообщения и таблицы message_status.
Но в случае с мангустами я не могу найти все messages_status по параметру chat_id, так как нет соединений.
Так что в этом случае я должен сначала найти все сообщения в выпуклой части, а затем найти все записи message_status для каждого найденного сообщения, а затем обновить то, что, на мой взгляд, является слишком дорогостоящей операцией.
В любом случае, сделать это с помощью одной операции findAndUpdate?
Я пытался использовать заполнение, но вы, возможно, знаете, что заполнение не фильтрует дочерние записи по условиям, переданным в методе дочернего заполнения.