【问题标题】:Case insensitive search in mongo without regex?没有正则表达式的mongo中不区分大小写的搜索?
【发布时间】:2016-02-25 01:47:19
【问题描述】:

how can I do a case insensitive find in mongo”这个问题似乎主要是按照“使用正则表达式”来回答的。如果您的搜索字符串事先已知 (/foo/),或者已知不包含正则表达式运算符 (^.+*$/\-()[]...),这很好。

就我而言,我想对电子邮件地址进行不区分大小写的搜索,其中可以包含点和加号。 “正则表达式转义”字符串当然是可能的,但即使有一个标准的“Regex.escapeString”函数(which there isn't),对于这样一个简单的问题,它已经开始难以解释和维护了。

有没有办法在不使用正则表达式的情况下在 mongo 中进行不区分大小写的匹配?

【问题讨论】:

  • "all the answers" 这么说是有原因的,那是因为除非您存储了规范化的大小写字符串版本(可能是最好的选择),否则那就是你在做什么。至于“特殊字符”,你可以随时转义它们,这就是“\”的用途。所以“\\”表示“字符串”“\”。
  • 感谢@BlakesSeven。这听起来是一个很好的答案。 (我还改写了开头的双曲句)
  • 显然这不会解决所有情况,但是如果您将某些内容默认保存为全小写或全大写,则设置器将解决搜索问题。例如,对于保存为 FL、CA、NY 等的州,使用 set: state => state.toUpperCase() 也会导致您的搜索自动大写。

标签: regex mongodb mongoose


【解决方案1】:

您可以使用aggregate() 来执行此操作,而不是使用find()$regex

db.collection.aggregate([
  {
    "$match": {
      "$expr": {
        "$eq": [
          { "$toLower": "$email" },
          { "$toLower": "EXAMPLE+@gmail.com" }
        ]
      }
    }
  }
])

Working Example

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    相关资源
    最近更新 更多