web-dev-qa-db-fra.com

Mongoid OR syntaxe de requête

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?

43
Akshat

Ouais, cela était mieux documenté. Essaye ça:

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

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 .

117
James Lim

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

7
Johan Tique

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]"]}}]}
  • Si vous avez Users avec 2 des 3 e-mails de votre base de données, le sélecteur renvoie un nombre de 2.
  • Si vous avez un 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.
6
Laura

Dans Mongoid 5.0, cela fonctionne pour moi

Username.or({username: @username}).or({email: @email})
3
miguel savignano