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 trong index.
2. Mọi field trong kết quả trả về cũng nằm trong index.
3. Phải loại _id khỏi projection nếu _id không có trong index.
4. Field truy vấn không phải mảng (multikey index không cover được).
js
db.users.createIndex({ status: 1, email: 1 })
// covered: lọc theo status, chỉ lấy email, tắt _id
db.users.find({ status: 'active' }, { _id: 0, email: 1 })
// không covered: lấy thêm name (không có trong index) → phải FETCH document
db.users.find({ status: 'active' }, { _id: 0, email: 1, name: 1 })Lợi ích rõ nhất ở các query danh sách/autocomplete tần suất cao: index thường nhỏ hơn dữ liệu nhiều lần nên khả năng nằm sẵn trong RAM cao hơn, tránh được một lần đọc ngẫu nhiên xuống đĩa cho mỗi kết quả.