Ответ 1
Да, это было лучше документировано. Попробуйте следующее:
Username.any_of({:username => @username},
{:email => @email})
Это нужно спросить много, но это очень плохо документировано. Нет упоминания в http://mongoid.org/en/mongoid/docs/querying.html
Я пытаюсь проверить, существует ли пользователь (ниже - запрос И), как я могу изменить его на запрос типа OR
Username.where(:username=>@username, :email=>@email)
(либо адрес электронной почты, либо имя пользователя должны совпадать).
Я нашел несколько довольно сложных способов в Интернете, включая отправку прямого javascript (from): http://omarqureshi.net/articles/2010-6-17-using-or-in-mongoid
Неужели должен быть простой ясный синтаксис, чтобы сделать это правильно?
Да, это было лучше документировано. Попробуйте следующее:
Username.any_of({:username => @username},
{:email => @email})
Для других, которые попадают на эту страницу, обновленный синтаксис теперь
Username.or({username: @username}, {email: @email}).
Обратитесь к обновленным документам.
В ответе @miguel-savignano есть опечатка. Согласно Stackoverflow, "очередь редактирования заполнена", поэтому я не отправил изменения.
Правильный синтаксис:
Username.or({username: @username}).or({email: @email})
Более сжатое решение:
Username.or({username: @username}, {email: @email})
Монгольский селектор разрешит:
{"$or"=>[{"username"=>@username}, {"email"=>@email}]}
Я нашел этот вопрос, поскольку пытаюсь решить для создания "или" запросов.
Если вы хотите совместить строку или какой-либо из массива элементов, тогда вам нужно будет написать запрос Mongoid с помощью селектора Mongo '$ in'.
Например, у вас есть определенное имя пользователя и массив писем. Вы хотели бы вернуть все результаты, по крайней мере, одно из полей соответствует либо имени пользователя, либо одному из писем внутри массива.
@username = "jess"
@emails = ["[email protected]", "[email protected]", "[email protected]"]
User.or({username: ""}, {email: {'$in': @emails}})
Монгольский селектор разрешит:
{"$or"=>[{"first_name"=>""}, {"email"=>{:$in=>["[email protected]", "[email protected]", "[email protected]"]}}]}
Users
с 2 из 3 электронных писем в вашей базе данных, селектор вернет счет 2.User
с username
"jess" и 3 дополнительными Users
с одним из заданных писем, тогда селектор вернет счет 4.Кроме того, в Mongoid 5.0, если вы все еще хотите использовать метод where
, используйте следующие
Username.where('$or' => [ { username: @username }, { email: @email } ])
это очень полезно, когда вы строите своего рода хеш запроса динамическим способом, и вам нужно сохранить метод where
В Mongoid 5.0 это работает для меня
Username.or({username: @username}.or({email: @email})