La salida allí es particular a una expresión regular que no está vinculada a la posición inicial de la cadena. Entonces, para una expresión regular que escaneará el índice y no la colección (aunque escaneará todo el índice en este caso), debe haber un conjunto de límites iniciales y límites finales:
Considere la primera consulta con una expresión regular diferente:
db.collection.find({ "username": /bob/ }).explain()
"indexBounds" : {
"username" : [
[
"",
{
}
],
[
/bob/,
/bob/
]
]
},
Eso significa que hay una cadena completa para buscar y luego la coincidencia terminará en algo que contenga "bob" como parte de la cadena. Entonces, la primera parte son los límites de coincidencia "léxicos" y la segunda parte es la expresión regular real que se aplicará:
La siguiente consulta muestra esto más claramente:
db.collection.find({ username: /^bob/ }).explain()
"indexBounds" : {
"username" : [
[
"bob",
"boc"
],
[
/^bob/,
/^bob/
]
]
},
Dado que está anclado al comienzo de la cadena, las únicas entradas del índice que deben probarse coinciden "léxicamente" entre "bob" y "boc". La expresión regular vuelve a estar contenida como la segunda parte de los límites.
Las entradas de límites generalmente se describen internamente como elementos de "dos partes", y existe este caso para las expresiones regulares, que en la primera parte tiene los límites de cadena que tienen sentido para hacer coincidir el índice, y luego para que la expresión regular se aplique a los que coinciden enteros.
Como nota final, vea lo siguiente:
db.collection.find({ username: {$gt: ""} }).explain()
"indexBounds" : {
"username" : [
[
"",
{
}
]
]
},
Que es intrínsecamente lo mismo que su consulta inicial, que dice que coincida con cualquiera cadena.