Хранение уведомлений с MongoDB (вместе со статусом чтения) - PullRequest
1 голос
/ 02 марта 2020

Это эффективный способ хранения уведомлений с MongoDB. Я хочу отслеживать прошлые уведомления, и если уведомление было прочитано пользователем.

NotificationSchema: {
   title: {type: String, required: true},
   context: {type: String, required: true},
   createdAt: {type: Date, default: Date.now(), required: true},
   readBy: [
      userObjectID: {type: mongoose.Schema.Types.ObjectId, required: true},
      readAt: {type: Date, required: true, default: Date.now()}
   ]
}

Меня беспокоит то, что, когда список становится большим, каждый пользователь должен будет go пройти через весь " readBy ", чтобы определить, прочитал ли его пользователь.

Должен ли я также хранить в UserSchema поле для записи всех уведомлений, прочитанных пользователем?

Спасибо! Любой вклад приветствуется.

1 Ответ

1 голос
/ 02 марта 2020

Вы можете создать дополнительную промежуточную модель, такую ​​как 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 требует только простой вставки только в одну коллекцию, и наша схема уведомлений и пользователей не загрязнена.

Но нам нужно настроить виртуальное заполнение в схемах уведомлений и пользователей, чтобы иметь возможность ссылаться на уведомления пользователей. Вы можете проверить этот ответ для примера, как настроить виртуальное заполнение.

...