Mongoid lub składnia zapytań

Trzeba o to pytać, ale jest to bardzo słabo udokumentowane. Nie ma żadnej wzmianki na http://mongoid.org/en/mongoid/docs/querying.html

Próbuję sprawdzić, czy użytkownik istnieje( poniżej jest zapytanie i), jak mogę go zmienić na zapytanie typu OR

Username.where(:username=>@username, :email=>@email)

(e-mail lub nazwa użytkownika muszą być zgodne).

Znalazłem kilka dość skomplikowanych sposobów w Internecie, w tym wysyłanie bezpośredniego javascript (z): http://omarqureshi.net/articles/2010-6-17-using-or-in-mongoid

Na pewno musi istnieć prosta, przejrzysta składnia, aby to zrobić poprawnie?

Author: Akshat, 2012-10-21

5 answers

Kiedyś to było lepiej udokumentowane. Spróbuj tego:

Username.any_of({:username => @username},
                {:email => @email})
 50
Author: Sergio Tulentsev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-21 15:56:58

Dla dobra innych, którzy kończą na tej stronie, zaktualizowana składnia jest teraz

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

Proszę zapoznać się z zaktualizowanymi dokumentami lub odpowiednimi impl.

 118
Author: James Lim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-19 04:51:58

W odpowiedzi @miguel-savignano jest literówka. Według Stackoverflow "Kolejka edycji jest pełna", dlatego nie wysłałem edycji.

Właściwa składnia:

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

Bardziej zwięzłe rozwiązanie:

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

Selektor Mongo rozwiąże się do:

{"$or"=>[{"username"=>@username}, {"email"=>@email}]}

Znalazłem to pytanie, gdy próbowałem rozwiązać dla tworzenia zapytań "lub".

Jeśli chcesz dopasować łańcuch znaków lub dowolny z tablicy elementów, musisz napisać Zapytanie Mongoid z selektorem Mongo '$in'.

Na przykład, masz określoną nazwę użytkownika i tablicę wiadomości e-mail. Chcesz zwrócić wszystkie wyniki, w których co najmniej jedno z pól pasuje do nazwy użytkownika lub jednego z e-maili w tablicy.

@username = "jess"
@emails = ["[email protected]", "[email protected]", "[email protected]"]
User.or({username: ""}, {email: {'$in': @emails}})

Selektor Mongo rozwiąże się do:

{"$or"=>[{"first_name"=>""}, {"email"=>{:$in=>["[email protected]", "[email protected]", "[email protected]"]}}]}
  • jeśli masz Users z 2 z 3 e-maili w bazie danych, selektor zwróci liczbę 2.
  • jeśli masz User z username "jess" i 3 dodatkowe Users każdy z jednym z podanych e-maili, następnie selektor zwróci liczbę 4.
 7
Author: Laura,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-28 02:15:22

Również w Mongoid 5.0, jeśli nadal chcesz używać metody where, użyj następującej metody

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

Jest to bardzo przydatne, gdy budujesz rodzaj hasha zapytania w sposób dynamiczny i musisz zachować metodę where

 7
Author: Johan Tique,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-22 00:50:09

W Mongoid 5.0 to działa dla mnie

Username.or({username: @username}).or({email: @email})
 3
Author: miguel savignano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-09-16 12:03:40