Vì mảng không giới hạn dẫn tới ba hệ quả xấu cùng lúc:
1. Chạm trần 16MB. Một document tối đa 16MB. Mảng comments của bài viết viral sẽ đụng trần và mọi lệnh ghi tiếp theo báo lỗi.
2. Ghi chậm dần. Document lớn lên thì WiredTiger phải cấp lại chỗ và ghi lại toàn bộ document mỗi lần $push, kể cả khi chỉ thêm một phần tử.
3. Đọc tốn băng thông. Chỉ cần tiêu đề bài viết nhưng vẫn kéo về cả nghìn comment, trừ khi luôn nhớ $slice/projection.
Hai cách xử lý:
js
// A. giữ mảng có trần: chỉ lưu 20 comment mới nhất để hiển thị nhanh
db.posts.updateOne(
{ _id: postId },
{ $push: { recentComments: { $each: [comment], $slice: -20 } } }
)
// B. tách comments ra collection riêng, tham chiếu postId + index theo postIdNguyên tắc: mảng chỉ nên embed khi số phần tử có giới hạn tự nhiên và biết trước (địa chỉ giao hàng, biến thể sản phẩm).
Còn thứ tăng theo thời gian không giới hạn thì tách ra.