Как автоматически удалять ссылки на идентификаторы объектов в mongodb

#javascript #arrays #mongodb #mongoose #mongoose-schema

#javascript #массивы #mongodb #мангуст #мангуст-схема

Вопрос:

я пытаюсь автоматически удалять ссылки на уведомления от пользователей, когда уведомление удаляется

схема пользователя выглядит следующим образом

 const mongoose = require("mongoose");

const userSchema = new mongoose.Schema({
 
  notifications: [
    {
      type: mongoose.Schema.Types.ObjectId,
      ref: "Notification",
    },
  ],
});

module.exports = mongoose.model("User", userSchema);
  

Модель уведомлений выглядит следующим образом

     const mongoose = require("mongoose");

const notificationSchema = new mongoose.Schema({
  type: String,
  created: {
    type: Date,
    default: Date.now,
  },
});
notificationSchema.pre("deleteOne", function (next) {
  this.model("User").deleteOne({ notifications: this._id }, next);
});
module.exports = mongoose.model("Notification", notificationSchema);
  

когда я пытаюсь удалить уведомление, я получаю сообщение об ошибке, которое выглядит так

 ObjectParameterError: Parameter "obj" to Document() must be an object, got User
  

также есть ли способ автоматически удалить его [ссылки на уведомления в user], используя TTL для уведомлений

Ответ №1:

хорошо, после нескольких попыток и ошибок. Я придумал это решение..

     const mongoose = require("mongoose");
const notificationSchema = new mongoose.Schema({
  type: String,
  created: {
    type: Date,
    default: Date.now,
  },
});
notificationSchema.pre("deleteOne", function (next) {
  let id = this.getQuery()["_id"];
  mongoose.model("User").findOne(
    {
      notifications: id,
    },
    (err, res) => {
      const index = res.notifications.findIndex((x) => x._id == id);
      res.notifications.splice(index, 1);
      res.save();
      next();
    }
  );
});
module.exports = mongoose.model("Notification", notificationSchema);
  

Могу ли я внести какие-либо улучшения?