Details
-
Improvement
-
Resolution: Unresolved
-
Minor - P4
-
None
-
None
-
None
-
Query Execution
Description
We currently support bounding clustered collection scans when there's a comparison match expression on the cluster key: https://github.com/10gen/mongo/blob/fd275f66b712e0af181b53575efbe8a87f214a5e/src/mongo/db/query/planner_access.cpp#L267-L272
It should be easy to support the $regex operator when the query and collection collators match using the existing IndexBoundsBuilder. Something like this:
IndexEntry ie{BSON("_id"_sd << 1), |
IndexType::INDEX_BTREE,
|
IndexDescriptor::IndexVersion::kV2,
|
false, |
{},
|
{},
|
false, |
true, |
CoreIndexInfo::Identifier("clustered"), |
nullptr,
|
{},
|
params.clusteredCollectionCollator,
|
nullptr};
|
OrderedIntervalList oil;
|
IndexBoundsBuilder::BoundsTightness bt;
|
IndexBoundsBuilder::translateRegex(regexExpr, BSON("_id"_sd << 1).firstElement(), ie, &oil, &bt); |
|
|
const auto& interval = oil.intervals.front(); // second interval is for regex objects, not possible in _id |
|
|
setMinRecord(collScan, record_id_helpers::keyForElem(interval.start, nullptr));
|
setMaxRecord(collScan, record_id_helpers::keyForElem(interval.end, nullptr));
|