Mongoid:对单个字段进行多次检查

时间:2012-02-22 05:57:54

标签: ruby mongodb mongoid

我需要选择与给定交易具有相同类型的交易。我需要检查它是否没有返回所有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”,“和” - 但仍无法找到合适的解决方案。

也许我做错了什么......因为这个......我的世界正在颠倒......:((

1 个答案:

答案 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中的方法,我只是从观察到的行为中回溯。