【问题标题】:How do you do wildcard searches with Mongoid in a Ruby on Rails environment?如何在 Ruby on Rails 环境中使用 Mongoid 进行通配符搜索?
【发布时间】:2012-04-13 18:52:44
【问题描述】:

Mongoid 文档只给出了一个通配符搜索的例子:

Person.where(first_name: /^d/i)

这会查找所有名字以“d”开头的人。

/^/i 代表什么?

如何找到所有名字在字符串中间带有“na”的人?例如,此查询将找到“jonathan”,因为“na”是整个字符串的子字符串。

是否有包含此信息的网站或指南?

【问题讨论】:

    标签: ruby-on-rails regex mongodb mongoid


    【解决方案1】:

    你需要这个来找到名字中带有“na”的人。

    Person.where(first_name: /na/i)
    

    至于你的例子:

    Person.where(first_name: /^d/i)
    

    ^ 表示“行首”。此正则表达式将匹配第一个字母为“d”的所有字符串。 /i 表示“进行不区分大小写的匹配”。所以它会匹配“d”和“D”。

    注意:只有前缀正则表达式(前面带有^)才能使用索引。

    是否有包含此信息的网站或指南?

    这里是my favourite

    【讨论】:

    • 如果字段first_name 的类型为Mongoid::EncryptedString,是否可以进行类似Person.where(first_name: /na/i) 的查询。我正在使用 mongoid 3.1.6 并得到 TypeError: no implicit conversion of Regexp into String.
    • @JagdeepSingh,不幸的是,不是直接的。不过,您可以遍历整个数据集,例如 Person.all.select { |p| p.first_name ~= /na/i },这显然效率较低。
    【解决方案2】:

    这不是“通配符”搜索,这称为正则表达式。

    /^d/i
    
    • 两个斜线只是正则表达式分隔符,您可以搜索这两个斜线之间的内容。
    • 以下i 是修饰符或选项。它改变了你的正则表达式的匹配行为,i 代表不区分大小写,意味着它匹配“d”和“D”。
    • 第一个字符^是一个锚点,它将搜索模式锚定到字符串的开头,意味着只匹配字符串开头的“d”

    关于正则表达式的一个很好的教程是tutorial on regular-expressions.info

    如果你想在字符串的任意位置搜索字符串,只需移除将模式绑定到开头的锚点,/na/ 将在字符串的任意位置找到“na”。

    【讨论】:

      猜你喜欢
      • 2011-03-11
      • 1970-01-01
      • 1970-01-01
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      • 2014-06-06
      • 2017-08-25
      • 2011-04-03
      相关资源
      最近更新 更多