Обновление записи о ребенке на основе ассоциации родителей в mongoose - PullRequest
0 голосов
/ 17 января 2019

Я создаю живую систему чата. У меня есть следующие модели для контекста этого вопроса:

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?

Я пытался использовать заполнение, но вы, возможно, знаете, что заполнение не фильтрует дочерние записи по условиям, переданным в методе дочернего заполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...