【问题标题】:Intersection of 2 mongo queries2个mongo查询的交集
【发布时间】:2015-12-06 16:18:22
【问题描述】:

我想模拟一个“&”运算符来搜索我的 mongo db 中的元素。

有4个可搜索字段nameidtagsnegative_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 ]

但是,这并不像我想要的那样,因为您需要所有匹配都发生在同一个属性上。

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

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

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

我想知道怎么做交叉口

【问题讨论】:

  • 你的意思是“||”不是“&” ...

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


【解决方案1】:

有两种不同的方法来处理这个问题。您是要让两个正则表达式都对每个字段进行评估,还是可以 a 为 name 为 true 而 b 为 id 为 true?

如果是后者,我会为此使用 gem:

gem 'mongoid_search'

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

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

如果您想要对每个字段应用两个 RegEx 表达式,只需将两者都放入非消耗模式并使用一个正则表达式。这称为正向超前断言 (?=) 与 .* 运算符相结合,允许颠倒顺序。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    • 2016-02-29
    • 2015-01-31
    • 1970-01-01
    相关资源
    最近更新 更多