La sortie y est particulière à une expression régulière qui n'est pas liée à la position de départ de la chaîne. Donc, pour une regex qui va scanner l'index et non la collection (même si elle va scanner l'index entier dans ce cas), il doit y avoir un ensemble de bornes de départ et de bornes de fin :
Considérez la première requête avec une expression régulière différente :
db.collection.find({ "username": /bob/ }).explain()
"indexBounds" : {
"username" : [
[
"",
{
}
],
[
/bob/,
/bob/
]
]
},
Cela signifie donc qu'il y a une chaîne entière à rechercher, puis la correspondance se terminera sur quelque chose qui contient "bob" dans le cadre de la chaîne. Ainsi, la première partie est les limites de correspondance "lexicales" et la seconde partie est la regex réelle à appliquer :
La requête suivante le montre plus clairement :
db.collection.find({ username: /^bob/ }).explain()
"indexBounds" : {
"username" : [
[
"bob",
"boc"
],
[
/^bob/,
/^bob/
]
]
},
Comme cela est ancré au début de la chaîne, les seules entrées de l'index qui doivent être testées correspondent "lexicalement" entre "bob" et "boc". L'expression régulière est à nouveau contenue dans la deuxième partie des limites.
Les entrées de limites sont généralement décrites comme des éléments "en deux parties" en interne, et il y a ce cas pour les expressions régulières, qui dans la première partie ont les limites de chaîne qui ont du sens pour faire correspondre l'index, puis pour que la regex s'applique à celles qui correspondent entiers.
Comme note finale, voyez ce qui suit :
db.collection.find({ username: {$gt: ""} }).explain()
"indexBounds" : {
"username" : [
[
"",
{
}
]
]
},
Ce qui est intrinsèquement le même que votre requête initiale, qui dit de correspondre à tout chaîne.