- MongoDB là gì và khi nào nên chọ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, collection và database trong MongoDB là gì?
- 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…
- BSON khác JSON thế nào?
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ỗ…
- `findOne`, `find`, `insertOne`, `updateOne` trong MongoDB dùng thế nào?
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…
- Embed document hay reference document trong MongoDB?
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ỏ…
- MongoDB document size limit ảnh hưởng schema design thế nào?
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…
- Index trong MongoDB giúp gì và có trade-off gì?
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).…
- Compound index trong MongoDB cần chọn thứ tự field thế nào?
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…
- Multikey index là gì?
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 index trong MongoDB dùng khi nào?
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` trong MongoDB là gì?
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` trong MongoDB là gì và có rủi ro gì?
$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…
- `$unwind` trong aggregation pipeline dùng làm gì?
- MongoDB có hỗ trợ ACID transaction không?
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 trong MongoDB giải quyết vấn đề gì?
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…
- Upsert trong MongoDB là gì?
- Write concern trong MongoDB là gì?
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 trong MongoDB là gì?
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 ở…
- `Cursor` trong MongoDB là gì và vì sao cần pagination?
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…
- Bulk operations trong MongoDB dùng khi nào?
- Oplog trong MongoDB là gì?
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…
- Schema versioning pattern là gì?
Đâ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à…
- Sharding key trong MongoDB là gì và chọn thế nào cho đúng?
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…
- Làm sao để thực hiện schema migration trong MongoDB?
- Phân biệt `B-tree` index của PostgreSQL và `B-tree` index của MongoDB?
- Tại sao MongoDB dùng BSON thay vì JSON?
- Lỗi "16MB document size limit" thường xảy ra khi nào và cách khắc phục?
- Capped Collections trong MongoDB là gì?
- Toán tử `$in` và `$or` khác nhau khi nào về mặt hiệu suất?
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ó…
- Giải thích hiện tượng "Eventual Consistency" khi đọc từ Secondary node.
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à gì? Khi nào nên dùng?
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 multi-document trong MongoDB hoạt động như thế nào?
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…
- Sự khác biệt giữa `updateOne` và `replaceOne`?
- 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.…
- Cơ chế khoá (Locking) của MongoDB hoạt động ra sao?
- Optimistic concurrency trong MongoDB làm thế nào?
- Multi-tenant MongoDB nên thiết kế thế nào?
- Khi MongoDB query chậm thì debug từ đâu?
- Khi nào không nên dùng MongoDB?
- Chạy `explain()` xong thì nhìn vào đâu để biết query có vấn đề?
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…
- Trong aggregation pipeline, vì sao `$match` nên đặt càng sớm càng tốt?
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ì sao không nên để một mảng trong document tăng không giới hạn?
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 trong MongoDB là gì và dùng vào việc gì?
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…
- Thiết kế bài viết và bình luận: embed comment vào post hay tách collection riêng? Quyết định dựa trên gì?
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…
- Quy tắc ESR khi xếp thứ tự field trong compound index là gì? Vì sao query có `sort` hay báo lỗi vượt bộ nhớ?
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ó index rồi nhưng query vẫn quét toàn bộ collection — những trường hợp nào index không được dùng?
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à gì và làm sao để query của bạn được "covered"?
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…
- Partial index và sparse index khác nhau thế nào? Khi nào dùng cái nào?
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…
- Aggregation báo lỗi vượt 100MB ở stage `$group`. Bật `allowDiskUse` có phải là cách đúng không?
Đó 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…
- MongoDB không có schema cố định thì làm sao chặn dữ liệu sai định dạng vào collection?
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…
- Hệ thống ghi 1 bản ghi cảm biến mỗi giây cho mỗi thiết bị. Thiết kế collection thế nào để không tạo hàng tỉ document nhỏ?
- Chọn nhầm shard key thì hậu quả cụ thể là gì và sửa được không?
- Chunk và balancer trong sharded cluster hoạt động ra sao? Jumbo chunk xử lý thế nào?
- Primary của replica set chết giữa lúc đang ghi thì chuyện gì xảy ra với các write đang dở?
- Code mới cần một field mà 50 triệu document cũ chưa có. Triển khai thế nào để không downtime?