1

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

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

我希望标准是不区分大小写的,这意味着我希望它匹配%w[Ruby Web Framework]以及%w[RUBY WEB FRAMEWORK]or%w[ruby web framework]等​​等......

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

4

4 回答 4

5

感谢Jordan 的支持,仅出于跟踪目的(对于我自己和其他人),我将发布整个解决方案。

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

 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

在保存/创建 mongoid 级别没有规范化,标签以大写或小写形式保存。

规范化(标签的不区分大小写匹配)完全在嵌套查询条件期间实现(它是嵌套的,因为嵌入了一对多模型)。

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

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

非常感谢 Luca G. Soave

于 2012-05-10T23:26:41.370 回答
4

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

于 2012-05-09T20:31:33.887 回答
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字段

于 2012-05-10T12:38:56.573 回答
0

为了在 mongo 请求中管理正则表达式(查找、更新..),
我这样做:
'p' 是一个存储要搜索的名称的变量

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

于 2014-05-10T16:39:15.777 回答