使用MongoID的不区分大小写的查询条件

时间:2012-05-09 20:24:44

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

我有一个查询条件,它会查找要匹配的元素数组(tags_array):

User.all_in('watchlists.tags_array' => tags_array)

我希望条件为CASE-INSENSITIVE,这意味着我希望它匹配%w[Ruby Web Framework]以及%w[RUBY WEB FRAMEWORK]%w[ruby web framework]等等......

这可能是通过mongoid还是我必须使用外部过滤技巧?

4 个答案:

答案 0 :(得分:5)

感谢the support of Jordan并且仅为了跟踪目的(对我自己和其他人而言),我将发布整个解决方案。

是的,Yuriy Goldshtrakh是对的,MongoDB仍然不支持不区分大小写的查询,但MongoID有正则表达式,我唯一的疑问就是性能下降,正如“mu is too short已经说过”但我没有检查到现在......无论如何它是:

 Object.const_set :Competitor, Struct.new(:html_url, :description, :watchers, :forks)
 def self.find_competitors(tags_array)
    competitors = []
    User.all_in('watchlists.tags_array' => tags_array.map{|tag|/^#{tag}/i}).only(:watchlists).each do |u|
     u.watchlists.all_in(:tags_array => tags_array.map{|tag|/^#{tag}/i}).desc(:watchers).each do |wl|
       competitors << Competitor.new(wl.html_url, wl.description, wl.watchers, wl.forks)
     end
    end
    return competitors
 end

在save / create mongoid级别没有规范化,标签保存为大写或小写。

标准化(标签的不区分大小写的匹配)在嵌套的查询标准期间完全实现(由于embedded one to many model而嵌套)。

如果您有更好的想法或代码,请发帖。

我还要感谢Luiz K.回答,即使我不遵循这样的方式:数据级别的规范化在我看来过于严格,失去了语义和弹性“用户”方面(实际上是标记者) )。无论如何,对于其他要求来说可能是一个很好的解决方案。

非常感谢 Luca G. Soave

答案 1 :(得分:4)

我不认为mongo支持非区分大小写的选择,您可以通过将数据全部转换为特定情况来规范化数据或使用正则表达式查找器

答案 2 :(得分:0)

这就是我所做的:

def create
    @noticia = Noticia.new(params[:noticia])
    @noticia.tags = @noticia.conteudo.html_safe.split(' ')
    @noticia.tags.each_with_index do |tag, index|
      @noticia.tags[index] = @noticia.tags[index].gsub(/<\/?[^>]*>/, "")
    end

我已将所有noticia的内容拆分为“标签”,并将其缩小。在我的搜索中,我执行以下操作:

def buscar
    array = params[:query].split(' ')
    array.each_with_index do |query, index|
      array[index] = array[index].gsub(/<\/?[^>]*>/, "").downcase
    end
    @noticias = Noticia.where(:tags.all => array).paginate(:page => params[:page])
  end

我也低估了我的查询搜索 不要忘记索引tags字段

答案 3 :(得分:0)

为了管理mongo请求中的regexp(查找,更新..)
我这样做:
'p'是存储要搜索的名称的变量

 reg =  /^#{p}$/i
 @db['pgm'].update({'nom' => reg }....