2

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

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

MagicalDoc.where(myregex: 'abc123xyz')

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

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

class MagicalDoc
  include Mongoid::Document

  field :myregex, type: Regexp
end

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

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

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

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

4

1 回答 1

0

regexp不是有效的BSON 类型,因此您必须弄清楚 Mongoid 如何表示它才能设计正确的查询。

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

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

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

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

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

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

于 2013-10-15T18:31:10.473 回答