Mongoid: несколько проверок на одном поле - PullRequest
2 голосов
/ 22 февраля 2012

Мне нужно выбрать транзакции того же типа, что и данная транзакция. И мне нужно убедиться, что он не возвращает все транзакции с типом 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", "and" - и все еще не могу найти рабочее решение.

Может, я что-то не так делаю ... Из-за этого мой мир переворачивается ...: (((

1 Ответ

6 голосов
/ 22 февраля 2012

Из тонкой инструкции :

Все запросы в Mongoid являются критериями, которые являются цепочечной и лениво оцениваемой оболочкой для динамического запроса MongoDB.

И, глядя на Criteria docs для 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:

{ :type => 'planned' }
{ :type => { :$ne => nil } }

и каким-то образом он заменяет nil на 'planned'. Я не знаю внутренних деталей where Монгоида или методов, которые он исправляет в Symbol, я просто возвращаюсь к наблюдаемому поведению.

...