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

Mer*_*ian 5 mongodb

所以,案子很简单。我想在字段上进行不区分大小写的搜索name。幸运的是,最新的 Mongo 为我们带来了排序规则和排序索引的概念。

这将很容易与类似的东西一起工作:

db.users.find({ name: 'John' }).collation({ locale: 'en', strength: 2 })
Run Code Online (Sandbox Code Playgroud)

我有给定排序强度的字段的支持索引 - 非常有效。

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

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

该排序规则适用于 name AND some-company-id。因此,它也会查找SOME-COMPANY-IDSoMe-CoMpAnY-iD,这可能会导致意外的冲突,并且由于所有情况都匹配,因此任何支持索引都companyId没有帮助。

我的问题是:如何在只有 1 个不区分大小写的字符串字段的情况下有效搜索

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

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

...但不幸的是任何索引都无法支持此搜索。

Mer*_*ian 2

到目前为止,经过长时间的讨论、谷歌搜索、试图联系 mongoDB 团队,我们决定没有什么比支持索引搜索的单独字段(例如name_lowercase.

  1. 它非常透明。
  2. 您可以按照您想要的方式管理不变量。
  3. 但你必须在你的代码库中支持它。
  4. 加倍的数据和索引需要更多的磁盘空间和网络带宽。

但如果您确实需要针对一种特定情况执行此操作,请按这种方式执行。