Cela doit être demandé beaucoup mais c'est très mal documenté. Il n'y a aucune mention à http://mongoid.org/en/mongoid/docs/querying.html
J'essaie de vérifier si un utilisateur existe (ci-dessous est une requête AND), comment puis-je le changer en une requête de type OR
Username.where(:username=>@username, :email=>@email)
(L'e-mail ou le nom d'utilisateur doivent correspondre).
J'ai trouvé des moyens assez compliqués en ligne, y compris l'envoi d'un javascript direct (de): http://omarqureshi.net/articles/2010-6-17-using-or-in-mongoid
Il doit sûrement y avoir une simple syntaxe claire pour le faire correctement?
Ouais, cela était mieux documenté. Essaye ça:
Username.any_of({:username => @username},
{:email => @email})
Pour le bien des autres qui se retrouvent sur cette page, la syntaxe mise à jour est maintenant
Username.or({username: @username}, {email: @email})
Veuillez vous référer aux documents mis à jour ou implic pertinent .
De plus, dans Mongoid 5.0, si vous souhaitez toujours utiliser la méthode where
, utilisez ce qui suit
Username.where('$or' => [ { username: @username }, { email: @email } ])
ceci est très utile lorsque vous créez une sorte de hachage de requête de manière dynamique et que vous devez conserver la méthode where
Il y a une faute de frappe dans la réponse de @ miguel-savignano. Selon Stackoverflow, la "file d'attente de modification est pleine", c'est pourquoi je n'ai pas soumis de modification.
Syntaxe appropriée:
Username.or({username: @username}).or({email: @email})
Une solution plus concise:
Username.or({username: @username}, {email: @email})
Le sélecteur Mongo se résoudra à:
{"$or"=>[{"username"=>@username}, {"email"=>@email}]}
J'ai trouvé cette question alors que j'essayais de la résoudre pour créer des requêtes "ou".
Si vous cherchez à faire correspondre une chaîne ou l'un quelconque d'un tableau d'éléments, vous devrez alors écrire une requête Mongoid avec le sélecteur Mongo '$ in'.
Par exemple, vous avez un nom d'utilisateur spécifique et un ensemble d'e-mails. Vous souhaitez renvoyer tous les résultats où au moins un des champs correspond au nom d'utilisateur ou à l'un des e-mails du tableau.
@username = "jess"
@emails = ["[email protected]", "[email protected]", "[email protected]"]
User.or({username: ""}, {email: {'$in': @emails}})
Le sélecteur Mongo se résoudra à:
{"$or"=>[{"first_name"=>""}, {"email"=>{:$in=>["[email protected]", "[email protected]", "[email protected]"]}}]}
Users
avec 2 des 3 e-mails de votre base de données, le sélecteur renvoie un nombre de 2.User
avec le username
"jess" et 3 Users
supplémentaires chacun avec l'un des e-mails donnés, alors le sélecteur renverra un nombre de 4.Dans Mongoid 5.0, cela fonctionne pour moi
Username.or({username: @username}).or({email: @email})