Ruby Mongoid使用ne方法过滤指定条件条目无效果问题咨询
原写法问题说明
你写的语句存在语法逻辑错误:Mongoid的ne方法仅用于对单个字段做不等于匹配,无法直接作用于$or这类多条件组合逻辑,因此你写的过滤规则完全没有生效,才会返回所有符合时间窗口的条目。
正确写法
你的需求是排除满足「field1为true 或者 field2为true且field1为nil」的条目,刚好匹配MongoDB的$nor运算符的逻辑(匹配所有不满足数组中任意条件的文档),Mongoid已经封装了对应的nor方法,推荐写法如下:
user.array.where(timestamp: time_window) .nor( { field1: true }, { field2: true, field1: nil } )
如果你更习惯显式对$or条件取反,也可以写为:
user.array.where(timestamp: time_window) .where( :$not => { :$or => [ { field1: true }, { field2: true, field1: nil } ] } )
两种写法执行效果完全一致,第一种写法封装层级更少,可读性更高。
内容的提问来源于stack exchange,提问作者Aneesh Akella
相关产品推荐
相关产品推荐

