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 và post, để bắt các sự kiện diễn ra như thêm, xoá, sửa trong mongodb.
Đây là chuỗi để bắt các sự kiện mà pre và post hỗ trợ:
Ở đâ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à Author và Book, 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
});
});