【问题标题】:How to query a Mongoid Regexp Field?如何查询 Mongodb 正则表达式字段?
【发布时间】:2013-10-23 15:29:07
【问题描述】:

我想在我的 Mongoid 文档中创建一个正则表达式字段,以便我可以有这样的行为:

MagicalDoc.create(myregex: /abc\d+xyz/)

MagicalDoc.where(myregex: 'abc123xyz')

我不确定这是否可行以及会产生什么样的影响。我怎样才能实现这种功能?

更新:我从Mongoid supports Regexp fields 的文档中了解到,但它没有提供如何查询它们的示例。

class MagicalDoc
  include Mongoid::Document

  field :myregex, type: Regexp
end

我也会接受纯 MongoDB 的答案。我可以找到一种将其转换为 Mongoid 语法的方法。

更新:感谢 SuperAce99 帮助找到此解决方案。将字符串传递给 Mongoid where 函数,它将创建一个 javascript 函数:

search_string = 'abc123xyz'
MagicalDoc.where(%Q{ return this.myregex.test("#{search_string}") })

%Q 是一种有助于转义引号的 Ruby 方法。

【问题讨论】:

    标签: ruby regex mongodb mongoid


    【解决方案1】:

    regexp 不是有效的BSON type,因此您必须弄清楚 Mongoid 如何表示它才能设计出合适的查询。

    使用正则表达式查询字符串

    如果您想向 MongoDB 发送正则表达式并返回文档,MongoDB 提供了$regex 查询运算符,它允许您返回字符串与您的正则表达式匹配的文档。

    使用字符串查询正则表达式

    如果您想向 Mongo 发送一个字符串并返回所有具有与提供的字符串匹配的正则表达式的文档,您可能需要$where operator。这允许您在每个文档上运行 Javascript 命令:

    db.myCollection.find( { $where: function() { return (this.credits == this.debits) } } )
    

    您可以定义一个函数,当提供的字符串与存储在文档中的正则表达式匹配时返回 True。显然这不能使用索引,因为它必须为集合中的每个文档执行代码。这些查询会很慢。

    【讨论】:

    • Regexp 是表示正则表达式的 Ruby 类。 Mongoid 将其转换为正确的 BSON 类型。
    • 我认为$regex 用于在查询中使用正则表达式。它不允许您传递字符串来查找具有与您的查询字符串匹配的正则表达式的所有文档。
    • 当然可以,但是它会转换成什么 BSON 类型?我怀疑它可能是像{type: "Regexp", value: "[a-z]+"} 这样的对象,在这种情况下,您可以像查询任何其他字符串一样查询value 字段。你真正想做什么?如果您想检索特定字段与您的正则表达式匹配的文档,$regex 运算符应该适合您。
    • 它应该将其转换为正则表达式:docs.mongodb.org/manual/reference/bson-types
    • 好发现 - 我在规范中没有看到。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    相关资源
    最近更新 更多