Вы можете создать дополнительную промежуточную модель, такую как UserNotification, и удалить поле массива readBy из Notification.
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const NotificationSchema = new Schema({
title: { type: String, required: true },
context: { type: String, required: true },
createdAt: { type: Date, default: Date.now(), required: true }
});
const UserSchema = new Schema({
username: { type: String, required: true }
});
const UserNotificationSchema = new Schema({
user: {
type: Schema.Types.ObjectId,
ref: "User"
},
notification: {
type: Schema.Types.ObjectId,
ref: "Notification"
},
readAt: { type: Date, required: true, default: Date.now() }
});
module.exports = {
Notification: mongoose.model("Notification", NotificationSchema),
User: mongoose.model("User", UserSchema),
UserNotification: mongoose.model("UserNotification", UserNotificationSchema)
};
При таком дизайне добавление UserNotification требует только простой вставки только в одну коллекцию, и наша схема уведомлений и пользователей не загрязнена.
Но нам нужно настроить виртуальное заполнение в схемах уведомлений и пользователей, чтобы иметь возможность ссылаться на уведомления пользователей. Вы можете проверить этот ответ для примера, как настроить виртуальное заполнение.