Dane wyjściowe odnoszą się do wyrażenia regularnego, które nie jest powiązane z pozycją początkową ciągu. Tak więc dla wyrażenia regularnego, które będzie skanować indeks, a nie kolekcję (nawet jeśli w tym przypadku będzie skanować cały indeks), musi istnieć zestaw granic początkowych i końcowych:
Rozważ pierwsze zapytanie z innym wyrażeniem regularnym:
db.collection.find({ "username": /bob/ }).explain()
"indexBounds" : {
"username" : [
[
"",
{
}
],
[
/bob/,
/bob/
]
]
},
Oznacza to, że do przeszukania jest cały ciąg, a następnie dopasowanie zakończy się na czymś, co zawiera „bob” jako część ciągu. Tak więc pierwsza część to „leksykalne” granice dopasowania, a druga część to rzeczywiste wyrażenie regularne do zastosowania:
Poniższe zapytanie pokazuje to wyraźniej:
db.collection.find({ username: /^bob/ }).explain()
"indexBounds" : {
"username" : [
[
"bob",
"boc"
],
[
/^bob/,
/^bob/
]
]
},
Ponieważ jest on zakotwiczony na początku ciągu, jedyne pozycje indeksu, które należy przetestować, pasują „leksykalnie” między „bob” i „boc”. Wyrażenie regularne jest ponownie zawarte jako druga część granic.
Wpisy dotyczące granic są ogólnie opisywane jako elementy „dwuczęściowe” wewnętrznie, i jest to przypadek dla wyrażeń regularnych, które w pierwszej części mają granice łańcuchowe, które mają sens dla dopasowania indeksu, a następnie dla wyrażenia regularnego stosowanego do tych pasujących całości.
Jako ostatnią uwagę zobacz:
db.collection.find({ username: {$gt: ""} }).explain()
"indexBounds" : {
"username" : [
[
"",
{
}
]
]
},
Co jest w istocie takie samo jak początkowe zapytanie, które mówi, że pasuje do dowolnego ciąg.