2个mongo查询的交集

时间:2015-12-06 16:18:22

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

我想效仿“&”用于在我的mongo db中搜索元素的运算符。

有4个可搜索字段name id tags negative_tags

如果匹配为真,则其中任何一个都可以匹配。

例如,如果我搜索a&b,则“a”可以在4个字段中的任何一个中匹配,也可以匹配“b”。但是,他们需要匹配

我尝试过以下

Model.or({:name.all => regexps}, {:id.all =>regexps}, {:tags.all => regexps}, {:negative_tags.all => regexps})

regexps是一个正则表达式数组。对于给出的示例,它将是

[ /a/i, /b/i ]

但是,这并不像我想要的那样,因为你需要匹配所有匹配属性。

我的另一个尝试是为每个regexp运行单独的mongo查询并获取集合的交集。

Model.or({:name.in => one_regexp}, {:id.in => one_regexp}, {:tags.in => one_regexp}, {:negative_tags.in => one_regexp})

我的问题是我不确定如何合并两个哈希值。 Mongoid懒惰地评估查询并返回Mongoid::Criteria对象。

我想知道如何做一个交叉点

1 个答案:

答案 0 :(得分:0)

有两种不同的方法可以解决这个问题。您是否尝试对每个字段进行正则表达式求值,或者对于名称是否为真,对于id,b是否为真?

如果是后者,我会使用宝石:

  

gem 'mongoid_search'

如果是前者,我只需将数组加入单个正则表达式中:

one_regexp.collect {|regexp| "(?=.*#{regexp}" }.join

如果你想要做的是在每个字段上应用两个RegEx表达式,只需将它们都放在非消耗模式中并使用一个正则表达式。这被称为正向前瞻断言(?=)与。*运算符相结合,允许顺序颠倒。

/(?=.*a)(?=.*b)/