MongoDB - Truy vấn được bao gồm
Trong chương này, chúng ta sẽ tìm hiểu về các truy vấn được đề cập.
Truy vấn được bao phủ là gì?
Theo tài liệu MongoDB chính thức, một truy vấn được đề cập là một truy vấn trong đó -
- Tất cả các trường trong truy vấn là một phần của chỉ mục.
- Tất cả các trường được trả về trong truy vấn đều nằm trong cùng một chỉ mục.
Vì tất cả các trường hiện diện trong truy vấn là một phần của chỉ mục, MongoDB khớp với các điều kiện truy vấn và trả về kết quả bằng cách sử dụng cùng một chỉ mục mà không thực sự tìm kiếm bên trong tài liệu. Vì các chỉ mục có trong RAM nên việc tìm nạp dữ liệu từ các chỉ mục nhanh hơn nhiều so với việc tìm nạp dữ liệu bằng cách quét tài liệu.
Sử dụng các truy vấn được bao phủ
Để kiểm tra các truy vấn được đề cập, hãy xem xét tài liệu sau trong users bộ sưu tập -
{
"_id": ObjectId("53402597d852426020000003"),
"contact": "987654321",
"dob": "01-01-1991",
"gender": "M",
"name": "Tom Benzamin",
"user_name": "tombenzamin"
}
Trước tiên, chúng tôi sẽ tạo một chỉ mục kết hợp cho users bộ sưu tập trên các lĩnh vực gender và user_name bằng cách sử dụng truy vấn sau -
>db.users.createIndex({gender:1,user_name:1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
Bây giờ, chỉ mục này sẽ bao gồm truy vấn sau:
>db.users.find({gender:"M"},{user_name:1,_id:0})
{ "user_name" : "tombenzamin" }
Điều đó có nghĩa là đối với truy vấn trên, MongoDB sẽ không xem xét các tài liệu cơ sở dữ liệu. Thay vào đó, nó sẽ tìm nạp dữ liệu cần thiết từ dữ liệu được lập chỉ mục rất nhanh.
Vì chỉ mục của chúng tôi không bao gồm _id, chúng tôi đã loại trừ nó một cách rõ ràng khỏi tập kết quả truy vấn của chúng tôi, vì MongoDB theo mặc định trả về trường _id trong mọi truy vấn. Vì vậy, truy vấn sau sẽ không được bao gồm bên trong chỉ mục được tạo ở trên -
>db.users.find({gender:"M"},{user_name:1})
{ "_id" : ObjectId("53402597d852426020000003"), "user_name" : "tombenzamin" }
Cuối cùng, hãy nhớ rằng một chỉ mục không thể bao hàm một truy vấn nếu -
- Bất kỳ trường nào được lập chỉ mục đều là một mảng
- Bất kỳ trường nào được lập chỉ mục đều là tài liệu con