Sử dụng middleware của mongoose để xoá tự động những document liên kết

Pham Kha
11:37 17-06-2024
96

 

Khi nào chúng ta nên sử dụng middleware của mongoose. Khi chúng ta cần làm một số thao tác gì trước hoặc sau khi thực thi một query, một cách tự động.

 

Mongoosee hỗ trợ hai hàm là pre post, để bắt các sự kiện diễn ra như thêm, xoá, sửa trong mongodb.

  • pre sẽ chạy trước câu query chính thực hiện, nghĩa là khi bạn thực thiên hàm xoá tác giả, thì nó sẽ chạy xoá những quyển sách của tác giả đó trước.
  • post sẽ chạy sau câu query chính, nghĩa là khi bạn xoá tác giả, thì tác giả sẽ được xoá trước, sau đó nó mới xoá những quyển sách của tác giả đó.

Đây là chuỗi để bắt các sự kiện mà pre post hỗ trợ:

  • aggregate
  • bulkWrite
  • count
  • countDocuments
  • createCollection
  • deleteOne
  • deleteMany
  • estimatedDocumentCount
  • find
  • findOne
  • findOneAndDelete
  • findOneAndReplace
  • findOneAndUpdate
  • init
  • insertMany
  • remove
  • replaceOne
  • save
  • update
  • updateOne
  • updateMany
  • validate

Ở đây mình thường sử dụng middleware của mongoose để ghi log, xoá những document mà có quan hệ với nhau.

Ví dụ: Bạn có 2 collection là AuthorBook, khi xoá tác giả thì sẽ tự đống xoá tất cả sách của tác giả đó viết, thì chúng ta làm như sau:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const AuthorSchema = new Schema({
  name: String
});

const BookSchema = new Schema({
  title: String,
  author: { type: Schema.Types.ObjectId, ref: 'Author' }
});

// Middleware để thực hiện cascade delete
AuthorSchema.pre('remove', function(next) {
//this.getQuery()._id là để lấy giá trị _id được truyền vào
  this.model('Book').deleteMany({ author: this.getQuery()._id }, next);
});

const Author = mongoose.model('Author', AuthorSchema);
const Book = mongoose.model('Book', BookSchema);

// Ví dụ xóa một tác giả và các sách của tác giả đó
Author.findById(authorId, (err, author) => {
  if (err) return handleError(err);
  author.remove((err) => {
    if (err) return handleError(err);
    // Tác giả và các sách của tác giả đã được xóa
  });
});

 

Bài viết mới