如何在MongoDB中仅针对单个字段进行不区分大小写的搜索?

5

所以,案例很简单。我希望在一个字段name上进行不区分大小写的搜索。幸运的是,最新的Mongo引入了排序规则和排序规则索引的概念。

这将很容易地与类似以下内容一起使用:

db.users.find({ name: 'John' }).collation({ locale: 'en', strength: 2 })

我对该领域拥有备选索引,可根据给定的排序强度进行筛选 - 非常高效。

不过,如果我想在一些更严格的范围内限制搜索,例如具有某个companyId常量,事情会变得有点混乱:

db.users.find({ companyId: 'some-company-id', name: 'John' }).collation({ locale: 'en', strength: 2 })

这种分类适用于名称和 some-company-id。因此,它也将查找 SOME-COMPANY-IDSoMe-CoMpAnY-iD,这可能会导致不必要的冲突,并且由于所有情况都匹配,对于 companyId 的任何支持索引都没有帮助。

我的问题是:如何有效地搜索只有一个字符串字段不区分大小写

可能的答案可以是类似于正则表达式搜索:

db.users.find({ companyId: 'some-company-id', name: /^John$/i })

...但很遗憾,任何索引都无法支持该搜索。

1个回答

2
到目前为止,经过长时间的讨论、搜索和尝试联系mongoDB团队,我们决定支持用于索引搜索的单独字段(例如name_lowercase)是最可靠和透明的选择。
以下是一些优点:
  1. 非常透明。
  2. 您可以按您想要的方式管理不变量。
  3. 但您必须在代码库中支持它。
  4. 重复的数据和索引需要更多的磁盘空间和网络带宽。
但是,如果您确实需要针对一个特定的情况这样做,那么就采用这种方法。

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