Výstup je specifický pro regulární výraz, který není vázán na počáteční pozici řetězce. Takže pro regulární výraz, který bude skenovat index a ne kolekci (i když v tomto případě bude skenovat celý index), musí existovat sada počátečních a konečných hranic:
Zvažte první dotaz s jiným regulárním výrazem:
db.collection.find({ "username": /bob/ }).explain()
"indexBounds" : {
"username" : [
[
"",
{
}
],
[
/bob/,
/bob/
]
]
},
To znamená, že je potřeba prohledat celý řetězec a pak shoda skončí na něčem, co obsahuje "bob" jako součást řetězce. Takže první část je „lexikální“ hranice shody a druhá část je skutečný regulární výraz, který se má použít:
Následující dotaz to ukazuje jasněji:
db.collection.find({ username: /^bob/ }).explain()
"indexBounds" : {
"username" : [
[
"bob",
"boc"
],
[
/^bob/,
/^bob/
]
]
},
Protože je to ukotveno na začátku řetězce, jediné položky indexu, které je třeba testovat, se "lexikálně" shodují mezi "bob" a "boc". Regulární výraz je opět obsažen jako druhá část hranic.
Položky hranic jsou obecně interně popsány jako prvky „dvoudílné“ a tento případ platí pro regulární výrazy, které v první části mají hranice řetězce, které dává smysl pro shodu indexu, a poté pro regulární výraz, který se použije na ty odpovídající. celistvosti.
Jako poslední poznámku pak viz následující:
db.collection.find({ username: {$gt: ""} }).explain()
"indexBounds" : {
"username" : [
[
"",
{
}
]
]
},
Což je v podstatě stejné jako váš původní dotaz, který říká, aby odpovídal jakémukoli řetězec.