如果您的查询依赖于低效的正则表达式匹配,请使用 聚合管道阶段创建并运行 MongoDB搜索查询,以提高文本查询的性能,该查询有更多用于自定义查询参数的选项。$search
避免低效正则表达式匹配
如果您经常运行不区分大小写的正则表达式查询(使用i
选项),我们建议使用带有 聚合管道阶段的 MongoDB搜索查询 $search
。
您可以在索引上指定 排序规则,以定义特定于语言的字符串比较规则,例如字母大小写和重音符号规则。但是,与MongoDB Search 查询相比,排序规则可能会导致某些功能丢失。在非MongoDB Search 环境中,不区分大小写的索引不会提高正则表达式查询的性能。$regex
查询运算符不支持排序规则,因此无法有效使用案例不区分大小写的索引。MongoDB Search 索引显着提高了区分大小写查询的性能,并提供了更多用于自定义查询参数的选项。
例子
考虑包含以下文档的 employees
集合:除了默认的 _id
索引之外,此集合没有其他索引:
// employees collection { "_id": 1, "first_name": "Hannah", "last_name": "Simmons", "dept": "Engineering" }, { "_id": 2, "first_name": "Michael", "last_name": "Hughes", "dept": "Security" }, { "_id": 3, "first_name": "Wendy", "last_name": "Crawford", "dept": "Human Resources" }, { "_id": 4, "first_name": "MICHAEL", "last_name": "FLORES", "dept": "Sales" }
如果您的应用程序经常查询 first_name
字段,您可能需要运行不区分大小写的正则表达式查询,以便更轻松地找到匹配的名称。不区分大小写的正则表达式还会匹配不同的数据格式,如上面的示例中,您同时拥有“Michael”和“MICHAEL”的 first_names
。但是,我们建议使用 聚合管道阶段的MongoDB搜索查询。$search
如果用户搜索字符串“michael”,应用程序可能会运行以下查询:
db.employees.find( { first_name: { $regex: /michael/i } } )
由于此查询指定 $regex 选项 i
,因此不区分大小写。该查询返回以下文档:
{ "_id" : 2, "first_name" : "Michael", "last_name" : "Hughes", "dept" : "Security" } { "_id" : 4, "first_name" : "MICHAEL", "last_name" : "FLORES", "dept" : "Sales" }
尽管此查询确实返回了预期的文档,但没有索引支持的不区分大小写的正则表达式查询的性能不是很高。要提高性能,请创建MongoDB Search索引:
{ "mappings": { "dynamic": true } }
排序规则 会造成一些功能损失。当索引的 collation
文档的 strength
字段为 1
或 2
时,该索引不区分大小写。有关排序规则文档和不同 strength
值的详细描述,请参阅排序规则文档。
对于要使用不区分大小写索引的应用程序,还必须在正则表达式查询中指定与索引相同的文档排序规则。虽然您可以从以前的 方法中删除$regex
find()
操作符并使用新创建的索引,但我们建议您使用带有 聚合管道阶段的 MongoDB搜索查询 $search
。
不区分大小写的查询 | MongoDB搜索查询 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
重要
在查询中使用不区分大小写的索引时,请勿使用 $regex操作符。$regex
实施不支持排序规则,也无法利用不区分大小写的索引。相反,我们建议使用 聚合管道阶段的MongoDB Search $search
查询。