在mongoid中使用LIKE / regex和变量

时间:2011-12-15 16:13:12

标签: ruby-on-rails mongodb ruby-on-rails-3.1 mongoid

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

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

但是,我希望能够搜索用户提供的字符串。我认为下面的内容可行,但事实并非如此:

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

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

提前致谢。

5 个答案:

答案 0 :(得分:25)

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

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

答案 1 :(得分:15)

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

相反

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

试试这个

  >>searchterm = "test"
  >>"/#{searchterm}/"
  >> "/test/" 

答案 2 :(得分:1)

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

没问题并且有结果

答案 3 :(得分:0)

这对我有用:

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

答案 4 :(得分:0)

@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