如何在 mongodb 中自动删除对象 ID 引用

Posted

技术标签:

【中文标题】如何在 mongodb 中自动删除对象 ID 引用【英文标题】:How to auto delete ObjectId referances in mongodb 【发布时间】:2021-02-19 04:17:10 【问题描述】:

当通知被删除时,我试图自动删除来自用户的通知引用

userSchema 看起来像

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

还有一种方法可以使用 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);

我可以做些改进吗?

【讨论】:

以上是关于如何在 mongodb 中自动删除对象 ID 引用的主要内容,如果未能解决你的问题,请参考以下文章

如果在mysql中删除父行,如何自动删除所有引用行?

从 mongodb 中的对象数组中删除 id

MongoDB,从数组中删除对象

考虑到 Mongoose Node.js 中的引用,如何删除对象?

(MONGODB) 删除父集合时如何删除引用的数据

如何使用 java spring 注释在 MongoDB 中创建一个完全填充的引用对象