MongoDb 索引搜索 returns 使用字符串包含操作时的整个集合

MongoDb Index Search returns the entire collection when using a string contains operation

为什么 MongoDb (4.2.6) return 索引中的每一行(排序规则 locale:en_US,strength:1),在搜索文档字段中包含的字符串时?示例查询:

db.eClearFaces.aggregate()
    .match({
        "Name": /Test/s
    })
    .collation({ locale: "en_US", "strength": 1 })

它正在使用的索引是:

名称只是文档中的一个字符串字段。结果查询计划显示集合中的每条记录都是 returned:

您可以在阶段 IXSCAN 中看到,它 return 编辑了 56k+ 个文档(我预计它 return 只有 6 个)。这导致下一阶段获取所有 56k 文档,但在获取的文档中,它 returned 6(正确计数)。

我对为什么感到困惑 - 我将索引和查询的排序规则配置为相同,而且它显然命中了索引。我不明白为什么它 return 将所有这些额外的行都转到下一阶段。

探查器的索引输出:

我是否错过了 MongoDb 索引或查询基础?

解决方案最终出现在 MongoDb 文档中。

The $regex implementation is not collation-aware and is unable to utilize case-insensitive indexes.

https://www.mongodb.com/docs/manual/reference/operator/query/regex/

因此,提供排序规则最终会影响性能。解决方案是有一个没有整理的索引。它仍然按预期执行索引扫描,但在从 table.

获取之前得到的结果要少得多