L'output è particolare per una regex che non è vincolata alla posizione iniziale della stringa. Quindi, per una regex che eseguirà la scansione dell'indice e non della raccolta (anche se in questo caso eseguirà la scansione dell'intero indice) è necessario un insieme di limiti iniziali e finali:
Considera la prima query con un'espressione regolare diversa:
db.collection.find({ "username": /bob/ }).explain()
"indexBounds" : {
"username" : [
[
"",
{
}
],
[
/bob/,
/bob/
]
]
},
Ciò significa che c'è un'intera stringa da cercare e quindi la corrispondenza finirà su qualcosa che contiene "bob" come parte della stringa. Quindi la prima parte è il limite di corrispondenza "lessicale" e la seconda parte è l'espressione regolare da applicare:
La seguente query lo mostra più chiaramente:
db.collection.find({ username: /^bob/ }).explain()
"indexBounds" : {
"username" : [
[
"bob",
"boc"
],
[
/^bob/,
/^bob/
]
]
},
Poiché è ancorato all'inizio della stringa, le uniche voci dell'indice che devono essere verificate corrispondono "lessicamente" tra "bob" e "boc". La regex è nuovamente contenuta come seconda parte dei limiti.
Le voci dei limiti sono generalmente descritte internamente come elementi "a due parti", e c'è questo caso per le espressioni regolari, che nella prima parte hanno i limiti di stringa che hanno senso per la corrispondenza dell'indice, e quindi per la regex da applicare a quelle che corrispondono intero.
Come nota finale, vedere quanto segue:
db.collection.find({ username: {$gt: ""} }).explain()
"indexBounds" : {
"username" : [
[
"",
{
}
]
]
},
Che è intrinsecamente la stessa della tua query iniziale, che dice di corrispondere a qualsiasi stringa.