【问题标题】:Case insensitive searching for words in mongoid在 mongoid 中不区分大小写搜索单词
【发布时间】:2011-09-17 16:11:14
【问题描述】:

有没有办法在 mongoid 中为不区分大小写的搜索设置属性?

假设某人有一个用户名:IAmGreat,我想使用他们唯一的用户名查找用户数据,而不是将其删除并将其更改为 iamgreat。

谢谢

【问题讨论】:

    标签: ruby-on-rails indexing mongoid case-insensitive


    【解决方案1】:

    其实你可以不区分大小写搜索。但是您必须使用正则表达式进行搜索! 这是我在http://www.VersionEye.com中使用它的一个例子@

    User.first(conditions: {email: /^#{email}$/i})
    

    使用“/”开始和结束正则表达式。正则表达式后的“i”表示不区分大小写。 “^”表示元素必须以搜索字符串开头,“$”表示元素必须以搜索字符串结尾。如果您正在寻找精确匹配,这一点很重要。

    【讨论】:

    • 仅供参考:如果包含用户输入,您可能需要清理正则表达式:/^#{Regexp.escape(email)}$/i
    • 用户 = where(email: /^#{email}$/i).first
    • /i 是技巧User.where(name: /.*#{term_to_search}.*/i).to_a 忽略给定字符串中的大小写
    【解决方案2】:

    您甚至可以尝试以下方法:

    User.where(username: /#{username}/i).first
    

    【讨论】:

    • (1) 不检查不区分大小写的相等性 (2) (AFAIK) 不会使用索引来检查集合,因此它可能非常昂贵。
    • 是的。这比默认查询慢 50%。但它确实检查不区分大小写的相等性。
    • 不,它不检查相等性。你的正则表达式没有锚。
    • 实际上 Mongoid 确实使用正则表达式查询的索引,但它是有限的。要充分利用正则表达式搜索的索引,请将正则表达式从字符串的开头开始,如下所示:User.where(username: /^#{username}/i).first(注意^
    【解决方案3】:

    如果你使用的是 rails 或 mongoid,你可以试试 ff:

    @user = User.where({:username => /.*#{name}.*/i })

    【讨论】:

      【解决方案4】:

      在进行比较时,为什么不直接删除User.login.downcase(或任何您的模型/属性组合)?这将使数据库中的大写保持原样,但将字段小写仅用于比较。

      【讨论】:

        【解决方案5】:

        如果您的应用程序不需要将用户输入存储为区分大小写,只需在输入时将输入转换为大写或小写即可。示例,

        username = params[:username].to_s.downcase
        

        否则,如果性能对您来说是个问题(不区分大小写的正则表达式无法利用索引),正确的解决方法是为用户名存储备份字段

        field :username_downcase
        

        然后进行查询:

        User.where(username_downcase: params[:username].to_s.downcase)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-15
          • 2013-09-26
          • 2023-03-20
          • 1970-01-01
          相关资源
          最近更新 更多