आउटपुट विशेष रूप से एक रेगेक्स के लिए है जो स्ट्रिंग की प्रारंभिक स्थिति से बाध्य नहीं है। तो एक रेगेक्स के लिए जो इंडेक्स को स्कैन करने जा रहा है, न कि संग्रह (भले ही यह इस मामले में पूरे इंडेक्स को स्कैन करेगा) वहां शुरुआती सीमाओं और समाप्ति सीमाओं का एक सेट होना चाहिए:
भिन्न रेगेक्स वाली पहली क्वेरी पर विचार करें:
db.collection.find({ "username": /bob/ }).explain()
"indexBounds" : {
"username" : [
[
"",
{
}
],
[
/bob/,
/bob/
]
]
},
तो यह दर्शाता है कि खोजने के लिए एक पूरी स्ट्रिंग है और फिर मैच उस चीज़ पर समाप्त हो जाएगा जिसमें स्ट्रिंग के हिस्से के रूप में "बॉब" होता है। तो पहला भाग "लेक्सिकल" मैच की सीमा है और दूसरा भाग लागू होने वाला वास्तविक रेगेक्स है:
निम्न क्वेरी इसे और अधिक स्पष्ट रूप से दिखाती है:
db.collection.find({ username: /^bob/ }).explain()
"indexBounds" : {
"username" : [
[
"bob",
"boc"
],
[
/^bob/,
/^bob/
]
]
},
चूंकि यह स्ट्रिंग की शुरुआत के लिए लंगर डाले हुए है, इंडेक्स की एकमात्र प्रविष्टियां जिन्हें "बॉब" और "बॉक" के बीच "लेक्सिकली" से मिलान करने की आवश्यकता है। रेगेक्स फिर से सीमा के दूसरे भाग के रूप में समाहित है।
सीमा प्रविष्टियों को आम तौर पर आंतरिक रूप से "दो भाग" तत्वों के रूप में वर्णित किया जाता है, और नियमित अभिव्यक्तियों के लिए यह मामला है, जिसमें पहले भाग में स्ट्रिंग सीमाएं होती हैं जो सूचकांक से मेल खाने के लिए समझ में आती हैं, और फिर रेगेक्स के लिए उन मिलानों पर लागू होती है संपूर्ण.
अंतिम नोट के रूप में निम्नलिखित देखें:
db.collection.find({ username: {$gt: ""} }).explain()
"indexBounds" : {
"username" : [
[
"",
{
}
]
]
},
जो आंतरिक रूप से आपकी प्रारंभिक क्वेरी के समान है, जो किसी . से मेल खाने के लिए कहती है स्ट्रिंग।