MongoDB 大小写不敏感索引无效问题解决方法

3
我有一个用户集合,其中一个文档字段名为leaderboard_name。它是一个文本字段,我希望能够以不区分大小写的方式查询它。
因此,我按照Mongo文档中的说明创建了一个自定义排序的新索引。我使用compass GUI创建了这个索引,并设置了locale = en,strength = 1,并将其他所有内容保持默认。

enter image description here

我有以下文档要查询:

{
  leaderboard_name: "johndoe"
}

我原以为使用这个索引,我可以查询到 JOHNDOE 并找到这个文档,但我一直没有得到任何结果。只有在区分大小写的情况下才能匹配成功。
即使解释计划也显示未在查询中使用索引:

enter image description here

这是MongoDB 4.0.16版本,我的理解是不区分大小写的排序支持从3.4版本开始就已经存在了。我查看了this answer,除了使用Compass创建索引而不是Mongo shell之外,我认为我已经做了其他所有的事情。

你必须在查询中指定排序选项。 - prasad_
请勿粘贴图片。请使用格式化文本代替代码。 - Wernfried Domscheit
@prasad_ 谢谢!我以为只查询 leaderboard_name 字段就会自动选择我创建的索引。 - Mike
1个回答

2

如果有其他人遇到同样的问题,解决方法是确保查询包含排序规则细节。在我的情况下,这意味着将我的Java查询更改为:

private final static Collation IGNORE_CASE =
        Collation.builder()
                .locale("en")
                .collationStrength(CollationStrength.PRIMARY)
                .build();

Document user =
        userCollection
                .find(new Document("leaderboard_name", "johndoe"))
                .collation(IGNORE_CASE)
                .first();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接