Điều đầu tiên bạn nghĩ đến ở đây là:tại sao việc lưu trữ một tham chiếu lại khiến bạn tốn gấp 5000 lần chi phí lưu trữ trong một tài liệu phụ?
Được rồi, nhìn vào lược đồ của bạn, tôi tin rằng phương pháp tốt nhất là tập hợp riêng cho các từ, không phải gói.
Lá cờ đỏ đầu tiên tôi thấy là sự lồng đôi của bạn ở đây:
Các góipackages : [{
package : {type: Schema.Types.ObjectId, ref: 'Packages'},
from : {type : Schema.Types.ObjectId, ref :'Languages'},
to : {type : Schema.Types.ObjectId, ref :'Languages'},
words : [{
word: {type: String},
progress: {type: Number,default : 0}
}]
}]
words
subocument sẽ rất khó làm việc với phiên bản MongoDB hiện tại, thông thường các cấp độ sâu 2-3 bắt đầu có vấn đề, đặc biệt là với các toán tử vị trí.
Bây giờ, hãy cân nhắc rằng bạn phải luôn làm việc từ giá trị cao nhất có thể mà bạn có thể nhận được tại đây:
Bạn cũng đã xem xét chi phí nhà ở trong tài liệu này. Các toán tử bạn cần sẽ là các toán tử trong bộ nhớ, chẳng hạn như $pull
, $push
, $addToSet
vv có nghĩa là toàn bộ tài liệu của bạn sẽ cần được tuần tự hóa và tải vào cấu trúc C ++ gốc của MongoDB. Đây sẽ là một nhiệm vụ cực kỳ tốn kém tùy thuộc vào lưu lượng truy cập vào các tài liệu đó.
Xem xét nhận xét của bạn:
nó chỉ đơn thuần đặt một chiếc đinh khác vào quan tài để nhúng các từ trong tài liệu người dùng chính. Xem xét những gì tôi đã nói trong đoạn trước, điều này sẽ không hoạt động tốt với chi phí sử dụng toán tử trong bộ nhớ trên words
mảng.
Điều này sẽ hoạt động tốt hơn nhiều nếu các từ được tách ra, $slice
cũng là một toán tử trong bộ nhớ và có thể sẽ bị giảm hiệu suất ở đây.
Và đó là một phản ứng hợp lý nhanh chóng. Tôi chắc chắn rằng tôi có thể giải thích thêm về lý do của mình nhưng như vậy là đủ.