Подтвердить что ты не робот

Синтаксис запроса Mongoid OR

Это нужно спросить много, но это очень плохо документировано. Нет упоминания в 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

Неужели должен быть простой ясный синтаксис, чтобы сделать это правильно?

4b9b3361

Ответ 1

Да, это было лучше документировано. Попробуйте следующее:

Username.any_of({:username => @username},
                {:email => @email})

Ответ 2

Для других, которые попадают на эту страницу, обновленный синтаксис теперь

Username.or({username: @username}, {email: @email}).

Обратитесь к обновленным документам.

Ответ 3

В ответе @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.

Ответ 4

Кроме того, в Mongoid 5.0, если вы все еще хотите использовать метод where, используйте следующие

Username.where('$or' => [ { username: @username }, { email: @email } ])

это очень полезно, когда вы строите своего рода хеш запроса динамическим способом, и вам нужно сохранить метод where

Ответ 5

В Mongoid 5.0 это работает для меня

Username.or({username: @username}.or({email: @email})