【发布时间】:2021-12-27 10:38:45
【问题描述】:
我们正在尝试在排除具有以某个前缀开头的字段的记录时使用索引,当使用以下内容时,未使用索引:
{"field": {"$not": {"$regex": "^abcd"}}}
而且要花很长时间才能得到结果。
但使用时:
{"field": {"$regex": "^abcd"}}
使用索引,我们立即得到结果!
有没有办法解决这个问题?
【问题讨论】:
我们正在尝试在排除具有以某个前缀开头的字段的记录时使用索引,当使用以下内容时,未使用索引:
{"field": {"$not": {"$regex": "^abcd"}}}
而且要花很长时间才能得到结果。
但使用时:
{"field": {"$regex": "^abcd"}}
使用索引,我们立即得到结果!
有没有办法解决这个问题?
【问题讨论】:
如果字符串只是字母数字,您可以使用不等式并完全避免使用正则表达式:
{$or: [{"field": {"$lt": "abcd"}}, {"field": {"$gt": "abcd~"}}]}
由于~ 大于z,该查询将返回所有不以该前缀开头的值,只要~ 不是您正在检查的值中的有效字符。
【讨论】:
.explain(true) 运行查询以查看它考虑了哪些查询,以及它们的执行情况。您尝试使用的索引的规格/键是什么?