在 mongoid 中使用 LIKE/regex 和变量

Posted

技术标签:

【中文标题】在 mongoid 中使用 LIKE/regex 和变量【英文标题】:Use LIKE/regex with variable in mongoid 【发布时间】:2012-01-21 07:51:14 【问题描述】:

我正在尝试查找文本中包含单词 test 的所有文档。以下工作正常:

@tweets = Tweet.any_of( :text => /.*test.*/ )

但是,我希望能够搜索用户提供的字符串。我认为下面的方法会起作用,但它不起作用:

searchterm = (params[:searchlogparams][:searchterm])
@tweets = Tweet.any_of( :text => "/.*"+searchterm+".*/" )

我已经尝试了我能想到的一切,任何人都知道我可以做些什么来完成这项工作。

提前致谢。

【问题讨论】:

我认为您应该在 /.*test.*/i 的末尾添加“i”以使其工作而不区分大小写。 【参考方案1】:
searchterm = (params[:searchlogparams][:searchterm])
@tweets = Tweet.any_of( :text => Regexp.new ("/.*"+searchterm+".*/") )

searchterm = (params[:searchlogparams][:searchterm])
@tweets = Tweet.any_of( :text => /.*#searchterm.*/ )

【讨论】:

如果我想搜索像孟买这样的位置并且我正在经过印度马哈拉施特拉邦孟买这样的位置,我需要做什么。但它没有搜索.. 这是我的查询 Event.any_of(location: /.*mumbai maharashtra.*/is).entries。它不工作,但如果我通过孟买,那么它工作。请提出建议。【参考方案2】:

mongodb 正则表达式查询没有任何问题。问题是将变量传递给 ruby​​ 正则表达式字符串。您不能像普通字符串一样将字符串与正则表达式混合

相反

 "/.*"+searchterm+".*/"

试试这个

  >>searchterm = "test"
  >>"/#searchterm/"
  >> "/test/" 

【讨论】:

非常感谢,拉梅什。我必须在开始和结束时删除 " ,然后你的例子就完美了。太棒了!【参考方案3】:
@tweets = Tweet.any_of( :text => Regexp.new (".*"+searchterm+".*") )

没问题,有结果

【讨论】:

【参考方案4】:

这对我有用:

Model.find(:all, :conditions => :field => /regex/i)

【讨论】:

【参考方案5】:
@tweets = Tweet.any_of( :text => Regexp.new ("/.*"+searchterm+".*/") )  

是工作,但没有结果

@tweets = Tweet.any_of( :text => Regexp.new (".*"+searchterm+".*") )

没问题,有结果

@tweets = Tweet.any_of( :text => /.*#searchterm.*/ )

是工作,没有结果

我的mongoid版本是3.1.3,ruby版本是1.9.3

【讨论】:

以上是关于在 mongoid 中使用 LIKE/regex 和变量的主要内容,如果未能解决你的问题,请参考以下文章

如何将内存中的 MongoDB 与 Rails、Mongoid 和 Rspec 一起使用?

在 Mongoid 中更新模型模式

如何在现有的rails模型中使用mongoid来种植数据?

如何在 Mongoid & Rails 中使用数组字段?

管理 mongoid 迁移

Mongoid 不在查询中