We are trying to use the index when excluding records with a fields that starts with a certain prefix, when using the following, index is not being used:
{"field": {"$not": {"$regex": "^abcd"}}}
And it takes forever to get the result.
But when using:
{"field": {"$regex": "^abcd"}}
The index is used and we get the result instantly!
Is there a way around this?
CodePudding user response:
I'm not expert on regex
but I think you can use ^(?!abcd)
like this:
db.collection.find({
"field": {
"$regex": "^(?!abcd)"
}
})
Example here
CodePudding user response:
If the string is only alpha-numeric, you can use inequalities and avoid the regex altogether:
{$or: [{"field": {"$lt": "abcd"}}, {"field": {"$gt": "abcd~"}}]}
Since ~
is greater than z
, that query will return all values that don't start with that prefix, as long as ~
is not a valid character in the value you are examining.