MongoDB cho vị trí Senior Backend / Tech Lead: document model và BSON, mô hình hoá dữ liệu, index và query engine, aggregation, storage engine WiredTiger, replica set, transaction, sharding, change stream, rồi vận hành và quyết định kiến trúc. Mỗi bài trả lời: bên trong chạy thế nào, hỏng ở đâu khi failover / tải tăng / dữ liệu lớn dần, và khi nào nên chọn thứ khác. Ví dụ trộn LMS (khoá học, ghi danh, log học tập) và e-commerce (catalog, đơn hàng, tồn kho). Nên đọc theo thứ tự. Mọi output là output thật: MongoDB 9.0.2 (so với 8.0.32), Laravel + mongodb/laravel-mongodb 5.11, Node.js driver 7.7 + Mongoose 9.10, PostgreSQL 18.4.
Tên field dài: 50 vs 24 MB BSON và cache giữ bản chưa nén; 1 196/1 200 ObjectId lệch thứ tự ghi; mảng khớp chéo phần tử; upsert đua ra 15 bản cho 10 lần; {"$ne": null} vẫn lọt laravel-mongodb 5.11 ở where 2 tham số.
Bài 2 · Mô hình hoáMảng 9,5 MB: 200 lần $push ghi 90 MB xuống đĩa, history store +80 MB; đổi tên 1 khoá chép trong 300k document = 62 MB oplog, dừng giữa chừng không rollback; 2 500 collection → RSS 805 MB; constraint (9.0); lazy migration mất cập nhật.
Bài 3 · IndexESR đọc 193 vs 12 927 key, nhưng range hẹp thì E-R-S thắng; multikey: 2 triệu đơn sinh 4,38 triệu key và trả trùng document; 10 index làm insert chậm 4,28×; TTL xoá trễ tới 60 s; từ 8.3 dropIndex sai tên vẫn báo OK.
Bài 4 · Query enginePlanner chọn plan theo 101 kết quả đầu: 2,2 s thay vì 6 ms; plan cache lật theo truy vấn đến trước; CBR của 9.0 chỉ chạy khi multi-planner trắng tay (lập plan 8 s → 1 s); query settings chặn/ghim plan; skip trang 100 000 đọc 2 triệu key.
Bài 5 · AggregationCùng báo cáo: PostgreSQL 3,5 s, MongoDB 31–60 s (khác điều kiện, đọc tỉ lệ); 9.0 dời $match qua $lookup: 33 s → 5,6 s; 100 MB/stage là byte ước lượng, heap thật +598 MB và 7 lần OOM-kill; $lookup thiếu index = N×M.
Bài 6 · WiredTigerw:1 + docker kill mất 9–302 write đã ack (9/9 lần), j:true/majority mất 0; dirty chạm 20% → app thread tự evict, p99 ×2–4, cache 1 GB không cứu; xoá nửa collection file to thêm 52%; snapshot mở → history store 87 MB/40 s.
Bài 7 · Replica setCắt mạng primary 30 s: mất 359–441 write w:1 đã ack, nằm trong rollback/*.bson (majority: 0); kill primary = 10–11 s không ghi được, priority takeover gây gián đoạn lần 2; PSA mất 1 node → flow control hãm ghi còn 100 update/s.
Bài 8 · TransactionĐếm rồi insert trong transaction: 50 client giành 10 chỗ lên 70/30 (PG RR cũng lọt, SERIALIZABLE chặn); document nóng: callback chạy ×4,3; 714 email cho 161 đơn; laravel-mongodb 5.11 báo thành công cho transaction đã mất.
Bài 9 · ShardingKey tăng dần dồn 100% insert vào 1 shard; orphan làm estimatedDocumentCount sai 37% suốt 1 giờ (9.0: orphanCleanupDelaySecs 3600 s); 4/5 range JUMBO mà balancer vẫn "compliant"; 2PC đọc local thấy nửa transaction; Eloquent save() không đổi được shard key.
Bài 10 · Change streamRelay outbox bị kill -9 sáu lần không mất message nhưng trùng 394 (lưu token theo lô); dual write mất 7/3000 im lặng; updateLookup sai bản 32–69%; collection ít ghi vẫn dính HistoryLost; driver Node chờ 30 s mới resume sau failover.
Bài 11 · Vận hànhMetric, connection pool, backup và PITR, upgrade và FCV, chi phí, SSPL, ma trận quyết định so với PostgreSQL JSONB, exit strategy.