ExpressJs - Mongoose:删除具有多对多关系的文档

时间:2021-06-06 13:14:59

标签: express mongoose mongoose-schema

我有两个具有多对多关系的模型,Post 和 Tag。

发布架构:

const postSchema = new Schema(
  {
    user: {
      type: Schema.Types.ObjectId,
      ref: 'User',
      required: [true, 'A post must belong to a user.'],
    },
    title: {
      type: String,
      unique: [true, 'A Post already exists with this title.'],
      required: [true, 'A Post must have a title.'],
    },
    slug: { type: String, unique: true },
    body: { type: String, required: [true, 'A Post must have a body.'] },
    coverImage: String,
    images: Array,
    isDraft: { type: Boolean, default: false },
    isPublished: { type: Boolean, default: false },
    tags: [{ type: Schema.Types.ObjectId, ref: 'Tag' }],
  },
  {
    timestamps: { currentTime: () => Math.floor(Date.now() / 1000) },
    toJSON: { virtuals: true },
    toObject: { virtuals: true },
  }
)

标签架构:

const tagSchema = new Schema(
  {
    title: { type: String, required: true },
    slug: { type: String },
    posts: [{ type: Schema.Types.ObjectId, ref: 'Post' }],
  },
  {
    timestamps: { currentTime: () => Math.floor(Date.now() / 1000) },
    toJSON: { virtuals: true },
    toObject: { virtuals: true },
  }
)

现在我想在删除帖子时从标签文档中删除帖子的所有引用。

我正在尝试使用 Post 模型中的以下 remove 中间件,但它不起作用。帖子被删除了,但引用仍然存在于标签文档中。

postSchema.pre('remove', function (next) {
  var post = this
  post
    .model('Tag')
    .update(
      { posts: { $in: post.tags } },
      { $pull: { posts: post._id } },
      { multi: true },
      next
    )
})

1 个答案:

答案 0 :(得分:0)

尝试了很多次之后,我终于把我做错了。按照我为使其工作所做的修复:

在 Post Controller 中,我以前是这样做的:

const post = await Post.findByIdAndDelete(req.params.id)

我改为:

const post = await Post.findById(req.params.id)
await post.remove()

在后期模型中:

postSchema.pre('remove', async function (next) {
  await this.model('Tag').updateMany(
    { posts: this._id },
    { $pull: { posts: this._id } },
    { multi: true },
    next
  )
})