bạn cần hiểu thứ tự thực thi mã của mình:
-
mongoose lấy tất cả sách từ cơ sở dữ liệu trong đó
{_creator:{$ne:null}}
. Mongo chỉ xem tài liệu tham khảo bên trong bộ sưu tập sách để xác định tài liệu nào cần trả lại. Sách của bạn vẫn có liên quan đến tác giả và mongo sẽ không nhận thấy rằng không có Tác giả phù hợp trong bộ sưu tập Tác giả, vì vậy sách của bạn đã được tải. -
mongoose đang điền tất cả các kết quả trả về:vì vậy nó đang tải các tác giả từ bộ sưu tập Tác giả và thay thế các tham chiếu bằng các đối tượng thực. Đối với cuốn sách của bạn, nó không tìm thấy tác giả phù hợp, vì vậy nó đặt
null
ở đó.
Đó là lý do tại sao bạn kết thúc với danh sách kết quả của mình.
Mongo không hỗ trợ kết hợp - do đó bạn không thể thực hiện truy vấn bao gồm dữ liệu từ nhiều hơn một tập hợp. Điền chỉ là một cách để thay thế các tham chiếu trong danh sách kết quả của bạn bằng dữ liệu thực, bạn không bao giờ có thể sử dụng dữ liệu đã phổ biến như một phần của mệnh đề where.
Để giải quyết vấn đề của mình, bạn có thể:
- lọc danh sách kết quả cuối cùng của bạn trong mã JS, ví dụ:với _.filter của thư viện lodash.
- cập nhật tất cả sách của bạn và xóa tài liệu tham khảo bất cứ khi nào bạn xóa tác giả. Bạn có thể sử dụng các hook trên Author-Schema để thực hiện việc này.
AuthorSchema.post('remove', function(doc) {// update your books here});