我需要选择与给定交易具有相同类型的交易。我需要检查它是否没有返回所有nil类型的事务。
使用ActiveRecord,我可以轻松编写:
given_transaction = Transaction.first
needed_transactions = Transaction.where('type != nil and type = ?', given_transaction.type)
所有作品
当我尝试用mongoid编写相同的东西时:
needed_transactions = Transaction.where(:type => given_transaction.type, :type.ne => nil)
它会生成以下查询:
"query"=>{:type=>{"$ne"=>"planned"}}
换句话说,mongoid忽略了第一次检查,只使用了对该字段的最后一次检查。
我尝试了“all_of”,“all_in”,“和” - 但仍无法找到合适的解决方案。
也许我做错了什么......因为这个......我的世界正在颠倒......:((
答案 0 :(得分:6)
来自fine manual:
Mongoid中的所有查询都是Criteria,它是MongoDB动态查询的可链接且延迟评估的包装器。
看着the Criteria docs for where
,我们看到一堆具有单一条件的例子。但请记住上面提到的可链接性。也许你正在寻找这个:
needed_transactions = Transaction.where(:type => given_transaction.type).where(:type.ne => nil)
Criteria#and
文档也可以很好地阅读:
添加另一个必须匹配的简单表达式才能返回结果。这与
Criteria#where
相同,主要用于语法糖。MONGOID # Match all people with last name Jordan and first name starting with d. Person.where(last_name: "Jordan").and(first_name: /^d/i) MONGODB QUERY SELECTOR { "last_name" : "Jordan", "first_name" : /^d/i }
我不得不承认,我不明白你为什么要这样检查:type
两次呢;如果given_transaction.type.nil?
是可能的,那么你甚至可以在不查询数据库的情况下处理它。
顺便说一下,使用ActiveRecord,你想说出来:
Transaction.where('type is not null and type = ?', given_transaction.type)
就你所涉及的奇怪查询而言,当你这样做时:
Transaction.where(:type => given_transaction.type, :type.ne => nil)
Mongoid最终尝试使用:type
键的两个值构建一个Hash:
{ :type => 'planned' }
{ :type => { :$ne => nil } }
并以某种方式最终将nil
替换为'planned'
。我不知道Mongoid的where
的内部细节或它补充到Symbol中的方法,我只是从观察到的行为中回溯。