Đầu ra ở đó là đặc biệt cho một regex không bị ràng buộc với vị trí bắt đầu của chuỗi. Vì vậy, đối với một regex sẽ quét chỉ mục chứ không phải bộ sưu tập (mặc dù nó sẽ quét toàn bộ chỉ mục trong trường hợp này), cần phải có một tập hợp các giới hạn bắt đầu và giới hạn kết thúc:
Hãy xem xét truy vấn đầu tiên với một regex khác:
db.collection.find({ "username": /bob/ }).explain()
"indexBounds" : {
"username" : [
[
"",
{
}
],
[
/bob/,
/bob/
]
]
},
Vì vậy, điều đó có nghĩa là có toàn bộ chuỗi để tìm kiếm và sau đó kết quả phù hợp sẽ kết thúc trên thứ có chứa "bob" như một phần của chuỗi. Vì vậy, phần đầu tiên là giới hạn đối sánh "từ vựng" và phần thứ hai là giới hạn thực tế sẽ được áp dụng:
Truy vấn sau đây cho thấy điều này rõ ràng hơn:
db.collection.find({ username: /^bob/ }).explain()
"indexBounds" : {
"username" : [
[
"bob",
"boc"
],
[
/^bob/,
/^bob/
]
]
},
Vì điều đó được neo vào đầu chuỗi, các mục nhập duy nhất của chỉ mục cần được kiểm tra khớp "từ vựng" giữa "bob" và "boc". Regex lại được chứa dưới dạng phần thứ hai của giới hạn.
Các mục nhập giới hạn thường được mô tả là các phần tử "hai phần" trong nội bộ và có trường hợp này đối với các biểu thức chính quy, trong phần đầu tiên có các giới hạn chuỗi có ý nghĩa đối với việc đối sánh chỉ mục và sau đó đối với regex để áp dụng cho các đối tượng khớp đó yêu cầu.
Lưu ý cuối cùng, hãy xem phần sau:
db.collection.find({ username: {$gt: ""} }).explain()
"indexBounds" : {
"username" : [
[
"",
{
}
]
]
},
Về bản chất, điều này giống với truy vấn ban đầu của bạn, có nghĩa là khớp với bất kỳ chuỗi.