Tổng hợp 54 câu hỏi phỏng vấn MongoDB kèm đáp án chi tiết, song ngữ Việt–Anh — sắp xếp từ cơ bản đến nâng cao. Ôn luyện miễn phí, tự động lưu tiến độ.
MongoDB là document database: thay vì bẻ dữ liệu thành nhiều bảng, nó lưu cả một "cục" dữ liệu liên quan trong một document (giống một object JSON) nằm trong collection. Bên dưới, document được lưu dạng BSON. Nên chọn khi: - Dữ liệu vốn…
- Document: đơn vị dữ liệu, lưu dạng BSON, giống một object JSON (gồm các cặp key-value). - Collection: một nhóm các document, tương tự "bảng" (table) trong RDBMS — nhưng không bắt buộc mọi document cùng cấu trúc. - Database: một namespace chứa nhiều…
Hiểu đơn giản: JSON là văn bản (text) để người và máy trao đổi dữ liệu; BSON (Binary JSON) là dạng nhị phân mà MongoDB dùng để lưu document — tối ưu cho tốc độ đọc và kích thước. Khác biệt quan trọng: BSON hỗ…
Bốn thao tác CRUD cơ bản trên một collection: - findOne: lấy đúng một document khớp điều kiện (hoặc null). - find: trả về một cursor (con trỏ) tới nhiều document khớp. - insertOne: thêm một document mới. - updateOne: cập nhật document đầu tiên…
Câu hỏi cốt lõi: dữ liệu con nên nằm bên trong document cha (embed) hay nằm ở collection riêng rồi trỏ tới (reference)? Nên Embed (nhúng) khi: - Dữ liệu con thuộc hẳn về cha và thường đọc cùng nhau. - Số lượng con nhỏ…
Mỗi document MongoDB tối đa 16MB. Hệ quả lên thiết kế: - Đừng embed vô hạn: các mảng có thể phình mãi như comments, events, logs, transactions thì không nên cứ nhồi vào document cha — sớm muộn sẽ chạm trần 16MB. - Dùng Reference…
Giống mục lục sách: index giúp MongoDB tìm thẳng tới document cần thay vì lật cả collection. Lợi ích: - Tìm kiếm nhanh hơn (tránh collection scan). - Hỗ trợ sắp xếp (sort) hiệu quả. Đánh đổi: - Tốn thêm dung lượng (disk và RAM).…
Như danh bạ sắp theo "họ rồi tên", thứ tự field trong compound index quyết định query nào dùng được nó. Quy tắc thực dụng là ESR (Equality → Sort → Range): - Equality trước: field lọc bằng (vd tenantId). - Sort tiếp theo: field…
Khi bạn index một field chứa mảng, MongoDB tự tạo multikey index: nó index từng phần tử trong mảng thay vì cả mảng, nên tìm document chứa một phần tử nào đó rất nhanh. Ví dụ: Lưu ý: cẩn thận với compound multikey index. Nếu…
TTL (Time-To-Live) index dùng để tự động xoá document sau một khoảng thời gian, dựa trên một field kiểu Date. Hợp cho: dữ liệu tạm như session, token/OTP, link xác thực, log ngắn hạn, cache. Ví dụ: Lưu ý: việc xoá không tức thời tuyệt…
ObjectId là kiểu dữ liệu mặc định cho field id trong MongoDB. Nó dài 12 byte, được sinh sao cho gần như duy nhất kể cả trên nhiều máy, và chứa sẵn phần timestamp nên có thể suy ra thời điểm tạo gần đúng (đỡ…
$lookup làm việc giống LEFT OUTER JOIN trong SQL: kéo dữ liệu từ một collection khác vào trong lúc aggregate. Rủi ro: MongoDB không phải DB quan hệ, nên $lookup thường chậm hơn nhiều khi collection lớn và điều kiện join không có index. Nếu…
Có. Từ bản 4.0, MongoDB hỗ trợ transaction ACID trên nhiều document (trên replica set), và từ 4.2 mở rộng cho sharded cluster. Nhưng nên nhớ: - MongoDB không sinh ra để lạm dụng transaction như RDBMS. - Chạy transaction làm giảm hiệu năng và…
Sharding giải quyết giới hạn vật lý của một server đơn lẻ bằng cách chia dữ liệu ra nhiều server (scale ngang). Dùng khi collection quá lớn không chứa nổi trên một đĩa, hoặc traffic đọc/ghi vượt CPU/RAM của con replica set mạnh nhất. Lưu…
Write concern là mức "đảm bảo đã ghi" mà client yêu cầu MongoDB xác nhận trước khi coi lệnh ghi là thành công. Các mức hay gặp: - w: 1 (mặc định): chỉ cần Primary nhận và ghi xong là báo thành công. - w:…
Read preference quyết định node nào trong replica set sẽ phục vụ lệnh đọc của client. Các lựa chọn hay gặp: - primary (mặc định): mọi lệnh đọc vào Primary → luôn thấy dữ liệu mới nhất (strong consistency). - secondaryPreferred: ưu tiên đọc ở…
Hàm find() không nạp hết kết quả vào RAM ngay, mà trả về một cursor — con trỏ tới tập kết quả. Khi bạn duyệt cursor, MongoDB lấy dữ liệu theo từng batch nhỏ. Vì vậy khi làm API trả danh sách, đừng toArray() trên…
Oplog (Operations Log) là một capped collection đặc biệt ghi lại mọi thao tác thay đổi dữ liệu (insert/update/delete) trên Primary. Các Secondary "đọc đuôi" (tail) oplog này và thực thi lại để đồng bộ với Primary — đây chính là cơ chế replication. Lưu…
Đây là pattern thêm một field như schemaVersion: 2 vào mỗi document để xử lý việc cấu trúc dữ liệu thay đổi theo thời gian. Thay vì chạy migration trên hàng triệu bản ghi (dễ gây downtime), app kiểm tra schemaVersion lúc đọc: nếu là…
Shard key là field (hoặc nhóm field) dùng để chia dữ liệu ra các shard. Chọn đúng ngay từ đầu là bắt buộc vì rất khó đổi sau này. Ba tiêu chí: - Cardinality cao (nhiều giá trị khác nhau): chọn status chỉ có active/inactive…
Cả hai đều khớp nhiều điều kiện, nhưng khác nhau: - $in: tìm nhiều giá trị trên cùng một field. Dễ tận dụng một index duy nhất, hiệu năng rất tốt. - $or: thường nối các điều kiện trên các field khác nhau. MongoDB có…
Mặc định, đọc từ Primary cho bạn "strong consistency" (luôn mới nhất). Nhưng nếu đặt readPreference về secondary, bạn có thể nhận dữ liệu cũ. Vì sao: khi Primary cập nhật, cần một chút thời gian (replication lag) để ghi vào oplog rồi truyền sang…
GridFS là một đặc tả của MongoDB để lưu và truy xuất file lớn hơn giới hạn 16MB của một document. Nó chẻ file thành nhiều mảnh nhỏ (chunk, mặc định 255KB) và lưu vào hai collection: fs.files (metadata) và fs.chunks (dữ liệu nhị phân).…
Transaction cho phép chạy một loạt thao tác (đọc/ghi) trên nhiều document hay nhiều collection mà vẫn đảm bảo atomicity: một lệnh lỗi thì toàn bộ rollback, và dữ liệu chưa commit không bị transaction khác đọc thấy (isolation). Trong MongoDB (từ 4.0), transaction chạy…
- updateOne: chỉ sửa một phần document qua các toán tử như $set, $inc, $push. Field nào không nhắc tới thì giữ nguyên. - replaceOne: thay toàn bộ nội dung document bằng document mới (vẫn giữ nguyên id). Quên field nào là field đó mất.…
Dùng explain('executionStats') và đọc ba con số trước, phần còn lại tính sau. - stage: COLLSCAN nghĩa là quét toàn bộ collection — thiếu index. IXSCAN là đang dùng index. - totalDocsExamined so với nReturned: đọc 500.000 document để trả về 20 là dấu hiệu…
Vì $match đứng đầu pipeline là stage duy nhất còn dùng được index. Sau khi dữ liệu đã đi qua $group, $project hay $unwind, nó chỉ còn nằm trong bộ nhớ — mọi $match sau đó phải quét tuần tự. Hai điểm liên quan hay…
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…
Change stream cho phép ứng dụng lắng nghe thay đổi dữ liệu (insert/update/delete) theo thời gian thực mà không cần polling. Nó đọc từ oplog của replica set, nên chỉ chạy được trên replica set hoặc sharded cluster, không chạy trên standalone. Các việc hay…
Quyết định theo cách truy cập dữ liệu và giới hạn tăng trưởng, không theo cảm tính "NoSQL thì embed". Embed khi: dữ liệu con luôn được đọc cùng cha, số lượng có trần, và ít cập nhật riêng lẻ. Tách reference khi: dữ liệu…
ESR = Equality, Sort, Range — thứ tự field trong compound index nên là: field so sánh bằng trước, rồi field dùng để sort, cuối cùng là field so sánh khoảng ($gt, $lt, $in dạng dải). Lý do: index là cấu trúc có thứ tự.…
Các trường hợp hay gặp nhất: - $regex không neo đầu chuỗi. /^abc/ dùng được index (là một dải liên tục); /abc/ hay /abc$/ thì không. Regex có i (không phân biệt hoa thường) cũng không dùng được index thường — cần index có collation…
Covered query là query mà MongoDB trả kết quả chỉ bằng index, không cần đọc document trong collection. Trong explain bạn thấy stage IXSCAN mà không có FETCH theo sau, và totalDocsExamined bằng 0. Điều kiện: 1. Mọi field trong điều kiện lọc đều nằm…
Sparse index chỉ bỏ qua document không có field được index. Partial index chỉ index document thoả một điều kiện filter bất kỳ — nó là bản tổng quát hơn và là lựa chọn mặc định nên dùng. Lợi ích của partial: nếu 95% đơn…
Đó là giới hạn 100MB bộ nhớ cho mỗi stage của aggregation pipeline (áp dụng cho $group, $sort, $bucket...). allowDiskUse: true cho phép stage ghi tạm ra đĩa để vượt trần. Nhưng nó là giải pháp tình thế, không phải cách sửa gốc: ghi/đọc file…
Dùng schema validation ở tầng database bằng $jsonSchema. Đây là lớp bảo vệ cuối, độc lập với validation của Mongoose/ứng dụng — quan trọng vì script thủ công và job nền thường ghi thẳng vào DB, không đi qua ORM. Hai tham số quyết định…